Je suis en train de travailler sur un projet qui a beaucoup de l'héritage du code C. Nous avons commencé à écrire en C++, avec l'intention d'éventuellement convertir le code héritage, ainsi. Je suis un peu confus sur la façon dont le C et le C++ interagir. Je comprends qu'en enveloppant le code C extern "C"
le compilateur C++ ne sera pas mangle le code C de noms, mais je ne suis pas entièrement sûr de savoir comment le mettre en œuvre.
Donc, en haut de chaque fichier en-tête C (après l'inclure des gardes), nous avons
#ifdef __cplusplus
extern "C" {
#endif
et au fond, nous écrire
#ifdef __cplusplus
}
#endif
Entre les deux, nous avons tous nos comprend, typedefs, et des prototypes de fonction. J'ai quelques questions, pour voir si je suis à la compréhension de cette correctement:
Si j'ai un fichier C++ A. hh qui inclut un fichier en-tête C B. h, comprend un autre fichier en-tête C C. h, comment cela fonctionne? Je pense que lorsque le compilateur étapes dans B. h,
__cplusplus
seront définies, de sorte qu'il se terminera avec le codeextern "C"
(et__cplusplus
ne sera pas définie à l'intérieur de ce bloc). Donc, quand il marche dans C. h,__cplusplus
ne sera pas défini et le code ne sera pas enveloppé dansextern "C"
. Est-ce correct?Est-il quelque chose de mal avec envelopper un morceau de code avec
extern "C" { extern "C" { .. } }
? Ce sera la deuxièmeextern "C"
faire?Nous n'avons pas mis ce wrapper autour de la .c fichiers, faites-le .h fichiers. Donc, ce qui se passe si une fonction n'a pas un prototype? Le compilateur pense que c'est une fonction C++?
Nous sommes également à l'aide de certains tiers le code qui est écrit en C, et ne pas cette sorte de wrapper autour de c'. Chaque fois que j'inclure un en-tête à partir de cette bibliothèque, j'ai été de mettre un
extern "C"
autour de #include. Est-ce la bonne façon de traiter avec qui?Enfin, il a créé une bonne idée? Est-il autre chose que nous devrions faire? Nous allons être un mélange de C et de C++ pour l'avenir prévisible, et je voulez vous assurer que nous allons couvrir tous les nos bases.