Partager via


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

Voir aussi

Référence

Utilisation d'extern pour spécifier la liaison