Spécifications de liaison
Le terme « spécification de liaison » fait référence au protocole de liaison de fonctions (ou de procédures) écrites dans différents langages. Les conventions d'appel suivantes sont affectées :
Respect de la casse dans les noms.
Décoration des noms. En C, le compilateur affecte un trait de soulignement comme préfixe aux noms. Cette opération est souvent appelée « décoration ». En C++, la décoration des noms sert à conserver les informations de type lors de la phase de liaison. (Consultez Noms décorés)
Ordre dans lequel les arguments sont attendus sur la pile.
Responsabilité du réglage de la pile lors du retour de fonction. La fonction appelée ou la fonction appelante est responsable.
Passage des arguments masqués (si les arguments masqués sont passés).
extern string-literal { declaration-list }
extern string-literal declaration
La spécification de liaison facilite le portage progressif du code C vers C++ en autorisant l'utilisation du code existant.
Section spécifique à Microsoft
Les seules spécifications de liaison actuellement prises en charge par Microsoft C++ sont "C" et "C++".
FIN de la section spécifique à Microsoft
L'exemple suivant déclare les fonctions atoi et atol avec la liaison C :
extern "C"
{
int atoi( char *string );
long atol( char *string );
}
Les appels à ces fonctions sont effectuées à l'aide de la liaison C. Le même résultat peut être obtenu avec les deux déclarations suivantes :
extern "C" int atoi( char *string );
extern "C" long atol( char *string );
Section spécifique à Microsoft
Tous les fichiers Include standard Microsoft C utilisent des directives de compilation conditionnelle pour détecter la compilation C++. Lorsqu'une compilation C++ est détectée, les prototypes sont placés dans une directive extern "C" comme suit :
// Sample.h
#if defined(__cplusplus)
extern "C"
{
#endif
// Function declarations
#if defined(__cplusplus)
}
#endif
FIN de la section spécifique à Microsoft
Vous n'avez pas besoin de déclarer les fonctions dans les fichiers Include standard comme extern "C".
Si une fonction est surchargée, une seule des fonctions du même nom peut avoir un spécificateur de liaison. (Pour plus d'informations, consultez Surcharge de fonction.)
Le tableau suivant illustre le fonctionnement des différentes spécifications de liaison.
Effets des spécifications 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 tous les objets ou fonctions déclarés dedans |
Sur une classe |
Affecte la liaison de tous les objets et fonctions non membres déclarés dans la classe |
Si une fonction a plusieurs spécifications de liaison, ils doivent concorder ; le fait de déclarer des fonctions comme ayant à la fois une liaison C et une liaison C++ constitue une erreur. En outre, si deux déclarations pour une fonction se produisent dans un programme (une avec une spécification de liaison et une autre sans), la déclaration avec la spécification de la liaison doit être la première. Toutes les déclarations redondantes de fonctions qui ont déjà une spécification de liaison sont affectées de 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.
Les fonctions et objets déclarés explicitement comme statiques dans le corps d'un spécificateur de liaison composé ({ }) sont traités comme des fonctions ou objets statiques ; le spécificateur de liaison est ignoré. Les autres fonctions et objets se comportent comme s'ils étaient déclarés avec le mot clé extern. (Consultez Utilisation d'extern pour spécifier la liaison pour plus d'informations sur le mot clé extern.)