1520 votes

Dans source C++, quel est l’effet d’extern « C » ?

<p>Que signifie exactement mettre « extern « C » » en C++ code ne ?<p>Par exemple :</p><pre><code></code></pre></p>

1470voto

Faisal Vali Points 10048

extern "C" fait une fonction de nom en C++ ont " C " de la liaison (compilateur ne pas marquer le nom), de sorte que le client le code C peut lien (j'.e à utiliser) votre fonction à l'aide d'un " C " compatible fichier d'en-tête qui contient juste la déclaration de votre fonction. Votre définition de fonction est contenue dans un format binaire (compilé par le compilateur C++) que le client 'C' de l'éditeur de liens est ensuite lier à l'aide de la " C " de nom.

Depuis C++ a une surcharge des noms de fonction et C ne le fait pas, le compilateur C++ ne peut pas simplement utiliser des le nom de la fonction comme un id unique pour le lien, donc il mangles le nom en ajoutant des informations sur les arguments. Un compilateur C n'a pas besoin de coder le nom puisque vous ne pouvez pas la surcharge des noms de fonction en C. Lorsque vous indiquer qu'une fonction a extern "C" de liaison en C++, le compilateur C++ ne prend pas en ajouter argument/type de paramètre information pour le nom utilisé pour la liaison.

Si vous le savez, vous pouvez indiquer "C" de liaison pour chaque déclaration/définition explicitement ou utiliser un bloc pour le groupe une séquence de déclarations et les définitions d'avoir un certain lien:

extern "C" void foo(int);
extern "C"
{
   void g(char);
   int i;
}

Si vous vous souciez de la technicité, ils sont répertoriés dans la section 7.5 du C++03 standard, voici un bref résumé (avec l'accent sur extern "C"):

  • extern "C" est un lien-spécification
  • Chaque compilateur est nécessaire de fournir des "C" lien
  • un lien cahier des charges doivent se produire que dans l'espace de noms de la portée
  • tous les types de fonction, les noms de fonction et les noms de variables ont une langue de liaison , Voir Richard Commentaire: Uniquement les noms de fonction et les noms de variables avec une liaison externe ont une langue de liaison
  • deux types de fonction avec la langue distincte liens sont de deux types distincts, même si, par ailleurs identiques
  • lien spécifications nid, intérieur détermine la finale de liaison
  • extern "C" est ignorée pour les membres de la classe
  • au plus une fonction avec un nom particulier peuvent avoir des "C" de la liaison (indépendamment de l'espace de noms)
  • extern "C" forces d'une fonction externe de la liaison (elle ne peut pas être statique) , Voir Richard commentaire: "statiques" à l'intérieur " extern "C"' est en cours de validité; une entité déclarée a une liaison interne, et n'a donc pas une langue de liaison
  • Lien à partir de C++ pour les objets définis dans d'autres langues et d'objets définis en C++ à partir d'autres langues est mise en œuvre défini et en fonction de la langue. Seulement lorsque l'objet de la mise en page des stratégies de deux implémentations de langue sont assez similaires tels le couplage d'être atteint

300voto

UncaAlby Points 616

Je voulais juste rajouter un peu d'info, car je ne l'ai pas vu, il est publié pour le moment.

Vous aurez très souvent voir le code en C les en-têtes de la sorte:

#ifdef __cplusplus
extern "C" {
#endif

// all of your legacy C code here

#ifdef __cplusplus
}
#endif

Ce qu'il accomplit, c'est qu'il vous permet d'utiliser que C fichier d'en-tête avec votre code C++, parce que la macro "__cplusplus" sera défini. Mais vous pouvez aussi toujours l'utiliser avec votre héritage, code C, lorsque la macro est PAS défini, afin de ne pas voir l'unique, le C++ construire.

Bien, j'ai aussi vu le code C++ tels que:

extern "C" {
#include "legacy_C_header.h"
}

qui, j'imagine, réalise près la même chose.

Pas sûr de ce qui est mieux, mais j'ai vu les deux.

200voto

sud03r Points 6093

Dans chaque programme en C++, tous les non-statique fonctions sont représentées dans le fichier binaire comme des symboles. Ces symboles sont spéciaux des chaînes de texte qui identifie de façon unique une fonction dans le programme.

En C, le nom du symbole est le même que le nom de la fonction. Cela est possible parce que C pas de deux non-statique fonctions ne peuvent avoir le même nom.

Parce que le C++ permet la surcharge et possède de nombreuses fonctionnalités que C n'est pas - comme pour les classes, les fonctions membres, à l'exception des spécifications - il n'est pas possible d'utiliser simplement le nom de la fonction que le nom du symbole. Pour le résoudre, C++ utilise des soi-disant name mangling, qui transforme le nom de la fonction et toutes les informations nécessaires (comme le nombre et la taille de l'argumentation) en quelques étranges chaîne qui seulement le compilateur connaît.

Donc, si vous spécifiez une fonction extern C, le compilateur n'effectue name mangling avec elle et qu'elle peut être directement accessible à l'aide de son nom de symbole.

C'est pratique tout en utilisant dlsym() et dlopen() pour l'appel de ces fonctions.

27voto

Employed Russian Points 50479
<p>Il modifie le lien d’une fonction de telle manière que la fonction est appelable à partir de C. Dans la pratique cela signifie que la fonction nom n’est pas <a href="http://en.wikipedia.org/wiki/Name%5Fmangling">tronqué</a>.</p>

25voto

Sander Points 131
<p>Pas n’importe quel en-tête C compile avec extern « C ». Quand les identificateurs dans un en-tête C entrent en conflit avec compilateur Mots-clés le C++ C++ va se plaindre à ce sujet.<p>Par exemple, j’ai vu le code suivant ne parviennent pas à un g ++ :<br></p><pre><code></code></pre><p>Un peu de sens, mais est quelque chose à garder à l’esprit lors du Portage de code C dans du code C++.</p></p>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X