Comment fonctionne " extern C++"?
, j'ai sauté dans winnt.h
et j'ai trouvé le code suivant:
extern "C++" // templates cannot be declared to have 'C' linkage
template <typename T, size_t N>
char (*RtlpNumberOf( UNALIGNED T (&)[N] ))[N];
Je voudrais poser des questions comme suit:
- comment
extern "C++"
travail? - est-ce portable parmi GCC, et Clang?
- Tous les modèles peuvent-ils être exportés avec cette syntaxe?
Avec la question 3, je veux dire que je peux séparer la declearation et la définition des modèles, puis générer un lien dynamique pour le modèle sans réellement donner l'implémentation en utilisant ceci truc?
2 réponses
Eh bien, extern "C++"
ne fonctionnera pas en C, Bien Sûr (bien que certains compilateurs puissent le supporter en tant qu'extension). Il est donc logique de l'utiliser en C++.
C'est parce que dans le cas de plusieurs spécificateurs de liaison externe imbriqués, le plus interne prend effet. Donc, si vous avez un fichier d'en-tête entouré de extern "C"
, vous pouvez utiliser extern "C++"
pour en sortir Temporairement et déclarer quelque chose avec une liaison C++.
C'est le plus logique lorsque vous voulez fournir une interface généralement C pour un c++ bibliothèque, mais vous voulez également fournir des bits d'assistance C++ pour les personnes qui l'utilisent réellement en C++. Donc, vous mettriez #ifdef __cplusplus \ extern "C" { \ #endif
autour de l'en-tête dans son ensemble, puis vous ifdef-dans ces bits avec extern "C++"
pour revenir à la liaison C++.
- cela fonctionne en forçant le compilateur à utiliser la liaison C++ lorsque le code environnant utilise la liaison C par défaut (par exemple, vous incluez winnt.h dans un programme C).
- Oui, il devrait être portable.
- Oui, ils peuvent. Il n'y a pas beaucoup d'utilisation pour "extern "C++"" dans les programmes C++ parce que le lien est "C++" de toute façon. Il est logique d'utiliser "extern" C++ "" uniquement s'il y a de bonnes chances que votre code C++ soit inclus dans un code C.