47 votes

Comment détecter si le code C (qui nécessite '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" { ... } , 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, la __cplusplus est également définie dans un bloc extern "C" { ... }

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

102voto

StoryTeller Points 6139

La pratique courante consiste à ne pas exiger que le code client encapsule votre en-tête dans extern "C" , mais à 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 d'autre que l'inclusion de l'en-tête.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X