Est extern “C” requis uniquement sur la déclaration de la fonction?

J'ai écrit une fonction C++ que j'ai besoin d'appeler à partir d'un programme C. Pour faire appelables à partir de C, j'ai précisé que extern "C" sur la fonction déclaration. J'ai ensuite compilé le code C++, mais le compilateur (Dignus Systèmes/C++) a généré un nom décomposé pour la fonction. Donc, il n'a apparemment pas l'honneur de la extern "C".

Pour résoudre ce problème, j'ai ajouté extern "C" à la fonction définition. Après cela, le compilateur a généré un nom de fonction qui est appelée à partir de C.

Techniquement, le extern "C" ne doit être spécifié sur la déclaration de la fonction. Est-ce exact? (Le C++ FAQ Lite a un bon exemple de cela.) Si vous spécifiez également sur la définition de la fonction?

Voici un exemple pour le démontrer:

/* ---------- */
/* "foo.h"    */
/* ---------- */

#ifdef __cplusplus
extern "C" {
#endif

/* Function declaration */
void foo(int);

#ifdef __cplusplus
}
#endif

/* ---------- */
/* "foo.cpp"  */
/* ---------- */

#include "foo.h"

/* Function definition */
extern "C"               //<---- Is this needed?
void foo(int i) {
  //do something...
}

Ma question est peut-être le résultat d'une mauvaise codage quelque chose, ou j'ai peut-être trouvé un bogue du compilateur. En tout cas, je voulais consulter stackoverflow pour faire sûr que je connais qui est, techniquement, le "droit" chemin.

  • Êtes-vous certains que vous obtenez en fait la déformation de foo, si vous laissez au large de la extern "C" foo.c dans l'exemple de code vous montrer? Ou était-ce juste quelque chose qui s'est produite dans d'autres plus compliquées code? J'ai assez souvent vu ce problème comme un symptôme de l'oubli d'inclure des foo.h foo.c.
  • Moïse: C'est un très bon point. Dans mon code, qui est un peu plus complexe que cela "toto" par exemple, je suis y compris l'en-tête dans le "rpc" fichier source. Ce qui m'a fait penser que le compilateur est une déformation du nom était ceci: Si je ne comprend pas le " extern "C" sur la définition de la fonction, alors le compilateur liste affiche le symbole externe, "foo_FPFPCc_v". Lorsque le " extern "C" " est inclus, la liste affiche le symbole externe, "foo".
  • il pourrait être intéressant d'expérimenter avec ce que le compilateur ne avec votre exemple simplifié. Si elle montre le même comportement, alors vous pourriez souhaitez envoyer une note pour le vendeur. Si ce n'est pas la même, alors vous devriez suivre ce qui se passe dans votre vraie construire, parce que ce serait indiquer que le tort de l'en-tête est apporté (ou quelque chose d'autre est de faire la déclaration de la fonction manquer).
  • Burr - C'est un bon point que cela pourrait être une accumulation de problème (par exemple, certains autres en-tête est arriver inclus, etc.). Je vais vous donner que d'essayer, et si j'apprends quelque chose de nouveau qui pourrait être utile à d'autres, je vais poster un commentaire ici. Merci!
InformationsquelleAutor bporter | 2009-09-04