Esta respuesta está inspirada en un caso en el que el razonamiento de Arne era correcto. Un proveedor escribió una biblioteca que una vez admitió tanto C como C ++; sin embargo, la última versión solo admite C. Las siguientes directivas vestigiales que quedan en el código eran engañosas:
#ifdef __cplusplus
extern "C" {
#endif
Esto me costó varias horas intentar compilar en C ++. Simplemente llamar a C desde C ++ fue mucho más fácil.
La convención ifdef __cplusplus viola el principio de responsabilidad única. Un código que utiliza esta convención intenta hacer dos cosas a la vez:
- (1) ejecutar una función en C - y -
- (2) ejecutar la misma función en C ++
Es como intentar escribir en inglés americano y británico al mismo tiempo. Esto es innecesariamente lanzar un #ifdef __thequeensenglish spanner #elif __yankeeenglish wrench #else una herramienta inútil que hace que el código sea más difícil de leer #endif en el código.
Para código simple y bibliotecas pequeñas, la convención ifdef __cplusplus puede funcionar; sin embargo, para bibliotecas complejas es mejor elegir un idioma u otro y seguir con él. Admitir uno de los idiomas requerirá menos mantenimiento que intentar admitir ambos.
Este es un registro de las modificaciones que hice al código de Arne para que se compilara en 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++
mensajes de error?