Caractéristiques de liaison
Le terme « linkage specification » fait référence au protocole pour lier des fonctions (ou des procédures) écrites dans différents langages.les conventions d'appel suivantes sont affectées :
respect de la casse des noms.
Décoration de noms.En C, le compilateur préfixe des noms par un trait de soulignement.Cela est souvent appelée « décoration. » En C++, la décoration de nom est utilisée pour conserver les informations de type via la phase de liaison.(Consultez noms décorés)
Ordre dans lequel les arguments sont supposés sur la pile.
Responsabilité d'ajustement de la pile au retour de fonction.La fonction appelée ou l'appel de la fonction est chargé.
passer des arguments masqués (si des arguments masqués sont passés).
extern string-literal { declaration-list }
extern string-literal declaration
Les spécifications de la liaison facilite déplacer progressivement le code C à C++ en vous permettant d'utiliser du code existant.
Spécifique à Microsoft
Les seules caractéristiques de liaison actuellement pris en charge par Microsoft C++ sont « C » et « C++ ».
détail de FIN Microsoft
L'exemple suivant déclare les fonctions atoi et atol avec liaison C :
extern "C"
{
int atoi( char *string );
long atol( char *string );
}
Les appels à ces fonctions sont effectués à l'aide d'une liaison C.Le même résultat peut être obtenu avec ces deux déclarations :
extern "C" int atoi( char *string );
extern "C" long atol( char *string );
Spécifique à Microsoft
Tous les fichiers Include standard Microsoft C utilisent des directives de compilation conditionnelle pour détecter la compilation C++.Lorsque la compilation C++ est détectée, les prototypes sont placés dans une directive d' extern « C » comme suit :
// Sample.h
#if defined(__cplusplus)
extern "C"
{
#endif
// Function declarations
#if defined(__cplusplus)
}
#endif
détail de FIN Microsoft
Vous n'avez pas besoin de déclarer des fonctions dans les fichiers Include standard en tant que extern « C ».
Si une fonction est surchargée, pas beaucoup des fonctions du même nom peut avoir un spécificateur de liaison.(Pour plus d'informations, consultez surcharge de fonction.)
Le tableau suivant indique les différentes caractéristiques de liaison s'exécutent.
effets des caractéristiques de liaison
spécification |
Effet |
---|---|
sur un objet |
Affecte la liaison de cet objet uniquement |
sur une fonction |
affecte la liaison de cette fonction et de toutes les fonctions ou les objets déclarés dans elle |
sur une classe |
Affecte la liaison de tous les fonctions et objets non - membres déclarés dans la classe |
Si une fonction a plusieurs spécifications de la liaison, ils doivent être en accord ; c'est une erreur de déclarer des fonctions comme ayant une liaison C et C++.En outre, si deux déclarations pour une fonction se produisent dans un programme - une avec une spécification de liaison et un sans - la déclaration avec la spécification de la liaison doivent être première.Toutes les déclarations redondantes des fonctions qui ont déjà les spécifications de la liaison sont fournies la liaison spécifiée dans la première déclaration.Par exemple :
extern "C" int CFunc1();
...
int CFunc1(); // Redeclaration is benign; C linkage is
// retained.
int CFunc2();
...
extern "C" int CFunc2(); // Error: not the first declaration of
// CFunc2; cannot contain linkage
// specifier.
Fonctions et objets explicitement déclarés comme statique dans le corps d'un spécificateur composé de liaison () sont traités comme des fonctions statiques ou objets ; le spécificateur de liaison est ignoré.D'autres fonctions et objets se comportent comme si déclaré avec le mot clé d' extern .(Voir l' En utilisant extern pour spécifier une liaison pour plus d'informations sur le mot clé d' extern .)