Этот ответ навеян случаем, когда аргументация Арне была правильной. Поставщик написал библиотеку, которая когда-то поддерживала как C, так и C ++; однако последняя версия поддерживала только C. Следующие рудиментарные директивы, оставленные в коде, вводили в заблуждение:
#ifdef __cplusplus
extern "C" {
#endif
Это стоило мне нескольких часов, пытаясь скомпилировать на C ++. Просто вызвать C из C ++ было намного проще.
Соглашение ifdef __cplusplus нарушает принцип единой ответственности. Код, использующий это соглашение, пытается делать две вещи одновременно:
- (1) выполнить функцию в C - и -
- (2) выполнить ту же функцию на C ++
Это все равно, что пытаться писать одновременно на американском и британском английском. Это излишне бросает #ifdef __thequeensenglish гаечный ключ #elif __yankeeenglish wrench # еще один бесполезный инструмент, который затрудняет чтение кода #endif в коде.
Для простого кода и небольших библиотек может работать соглашение ifdef __cplusplus; однако для сложных библиотек лучше выбрать тот или иной язык и придерживаться его. Поддержка одного из языков потребует меньшего обслуживания, чем попытка поддержки обоих.
Это запись изменений, которые я внес в код Арне, чтобы он компилировался в Ubuntu Linux.
foo.h :
#ifndef FOO_H
#define FOO_H
void foo(void);
#endif
foo.c
#include "foo.h"
#include <stdio.h>
void foo(void)
{
printf("This Hello World was called in C++ and written in C\n");
}
bar.cpp
extern "C" {
#include "foo.h"
}
int main() {
foo();
return(0);
}
Makefile
myfoobar: bar.o foo.o
g++ -o myfoobar foo.o bar.o
bar.o: bar.cpp
g++ -c -o bar.o bar.cpp
foo.o: foo.c
gcc -c -o foo.o foo.c
g++
сообщений об ошибках