Cette réponse est inspirée d'un cas où la justification d'Arne était correcte. Un fournisseur a écrit une bibliothèque qui supportait autrefois à la fois C et C ++; cependant, la dernière version ne supportait que C. Les directives restantes suivantes laissées dans le code étaient trompeuses:
#ifdef __cplusplus
extern "C" {
#endif
Cela m'a coûté plusieurs heures à essayer de compiler en C ++. Appeler simplement C à partir de C ++ était beaucoup plus facile.
La convention ifdef __cplusplus est en violation du principe de responsabilité unique. Un code utilisant cette convention essaie de faire deux choses à la fois:
- (1) exécuter une fonction en C - et -
- (2) exécuter la même fonction en C ++
C'est comme essayer d'écrire en anglais américain et britannique en même temps. Cela lance inutilement une clé #ifdef __thequeensenglish #elif __yankeeenglish #else un outil inutile qui rend le code plus difficile à lire #endif dans le code.
Pour le code simple et les petites bibliothèques, la convention ifdef __cplusplus peut fonctionner; cependant, pour les bibliothèques complexes, il est préférable de choisir l'une ou l'autre langue et de s'y tenir. La prise en charge de l'une des langues demandera moins de maintenance que la prise en charge des deux.
Ceci est un enregistrement des modifications que j'ai apportées au code d'Arne pour le faire compiler sur Ubuntu Linux.
toto.h :
#ifndef FOO_H
#define FOO_H
void foo(void);
#endif
toto.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++
des messages d'erreur