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?
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.