web-dev-qa-db-fra.com

Comment détecter si le code C (qui a besoin de 'extern C') est compilé en C ++

J'ai un en-tête C dans le cadre d'une bibliothèque C++.

Cet en-tête C n'aurait de sens que compilé par un compilateur C ou par un compilateur C++ dans un extern "C" { ... } bloquer, sinon des erreurs de lien non résolues se produiraient.

J'ai pensé ajouter un bloc tel que:

#ifdef __cplusplus
#error "Compiling C bindings with C++ (forgot 'extern \"C\"'?)"
#endif

dans l'en-tête C, mais malheureusement le __cplusplus macro est également définie dans un extern "C" { ... } bloquer.

Existe-t-il un autre moyen de détecter correctement cette condition?

46
fferri

La pratique courante consiste à ne pas exiger que le code client enveloppe votre en-tête dans extern "C", mais pour le faire vous-même sous condition. Par exemple:

#ifdef __cplusplus
extern "C" {
#endif

  // Header content

#ifdef __cplusplus
}
#endif

De cette façon, le code client est automatiquement correct sans rien faire au-delà de l'inclusion de l'en-tête.