extern C ne peut pas être utilisé au niveau de la classe?
Veux juste confirmer dans l'environnement Windows, VSTS 2008 + projet C++, on ne peut s'appliquer qu'extern C au niveau de la fonction, de ne pas être en mesure de demander à niveau de la classe (ainsi que toutes les fonctions membres de la classe d'usage C le nom de la langue mangling)? J'ai essayé de plusieurs façons, mais toujours l'erreur de compilation.
merci d'avance,
George
Puisque C n'a pas de notion de classes ou de fonctions membres, il n'est pas judicieux de donner des fonctions de membre du direct C au niveau de la liaison. Que voulez-vous vraiment?
Je veux sauver mon dactylographie et d'être plus flexible dans mon code, c'est à dire de définir un niveau de classe extern C option, puis tous à la suite de l'ajout de fonctions membres de la classe automatiquement "héritent" de cette option. Des commentaires ou des idées?
Pour quel but? Pour être en mesure d'appeler les fonctions de membre de la C? (Pas possible sans une indirection.) Pour avoir unmangled noms dans les objets? (Pas possible, collisions d'espace de noms.)
Je tiens à confirmer avec vous que les fonctions membres de la classe C++ ne peut pas être exportées à l'aide extern C, comment pourrions-nous l'exportation de la fonction membre? Définir la fonction globale emballage et à l'exportation global de la fonction wrapper?
La question que les gens se posent est la suivante: pourquoi voulez-vous exporter des fonctions de classe avec une liaison C? Quel que soit le montant de taper cela peut prendre, qu'est-ce que le point de cet. Normalement, les gens à l'exportation avec une liaison C afin de les rendre raccordables et appelable à partir du code C. Mais des fonctions de classe, de par leur nature ne sont pas remboursables à partir du code C. Même si vous parvenez à les exporter avec une liaison C en quelque sorte, vous ne serez pas en mesure de les appeler. Donc, la question est: quel est le point de l'exportation dans ce cas?
Je veux sauver mon dactylographie et d'être plus flexible dans mon code, c'est à dire de définir un niveau de classe extern C option, puis tous à la suite de l'ajout de fonctions membres de la classe automatiquement "héritent" de cette option. Des commentaires ou des idées?
Pour quel but? Pour être en mesure d'appeler les fonctions de membre de la C? (Pas possible sans une indirection.) Pour avoir unmangled noms dans les objets? (Pas possible, collisions d'espace de noms.)
Je tiens à confirmer avec vous que les fonctions membres de la classe C++ ne peut pas être exportées à l'aide extern C, comment pourrions-nous l'exportation de la fonction membre? Définir la fonction globale emballage et à l'exportation global de la fonction wrapper?
La question que les gens se posent est la suivante: pourquoi voulez-vous exporter des fonctions de classe avec une liaison C? Quel que soit le montant de taper cela peut prendre, qu'est-ce que le point de cet. Normalement, les gens à l'exportation avec une liaison C afin de les rendre raccordables et appelable à partir du code C. Mais des fonctions de classe, de par leur nature ne sont pas remboursables à partir du code C. Même si vous parvenez à les exporter avec une liaison C en quelque sorte, vous ne serez pas en mesure de les appeler. Donc, la question est: quel est le point de l'exportation dans ce cas?
OriginalL'auteur George2 | 2009-06-22
Vous devez vous connecter pour publier un commentaire.
Vous pouvez trier les appliquer
extern "C"
à une fonction membre par l'intermédiaire d'un très compliquées (mais tout à fait légal) hack:C'est possible selon la norme ISO C++03 9.3[classe.mfct]/9:
Cependant, ce n'est pas vraiment acheter quelque chose, car de la norme ISO C++03 7.5[dcl.lien]/4:
typedef int bar_t(int) const;
dans ce cas, cette typedef nom sera uniquement utilisable pour la déclaration des fonctions membres, mais pas de fonctions ordinaires.OriginalL'auteur Pavel Minaev
extern "c" utilise c-style de la liaison, qui est, le raw nom de la fonction est ce que l'exposé de la bibliothèque. Parce que c'est juste un cru de nom de fonction, aucun de C++fonctionnalités uniquement pour vous, y compris les méthodes ou extern données membres dans les espaces de noms, des classes, des structures ou des syndicats.
Clarifier: les Structures et les syndicats sont en C, mais n'ont pas de fonctions membres, de sorte que leur membre de fonctions en C++ ne peut pas être exporté dans un style c (et les struct et union définitions ne doivent pas être exportés, car il est déjà dans l'en-tête)
Merci Todd, si les fonctions membres de la classe peuvent pas être exportées à l'aide extern C, comment pourrions-nous l'exportation de la fonction membre? Définir la fonction globale emballage et à l'exportation global de la fonction wrapper?
OriginalL'auteur Todd Gardner
Je crains que non. Mais si vous voulez passer un objet de C++ pour les fonctions C, vous pouvez vous référer à ce lien: http://www.parashift.com/c++-faq-lite/mixage-c-et-rpc.html#faq-32.8
@ephemient: _
Je suppose que ysth a été d'essayer de fournir un contre-exemple, mais je ne la vois pas: C identificateur "" --> le symbole "" pour la liaison.
qu'entendez-vous par "C identificateur "" --> le symbole "" pour les liens."? Pourriez-vous dire en quelques mots s'il vous plaît?
Vous pouvez définir des "C-style mangling" que "pas de déformation." Name mangling est utilisé pour le C++ comme un moyen d'obtenir des linkers pour de faux soutien pour les fonctions surchargées. Puisque C n'ont pas de fonctions surchargées, vous n'avez pas à vous inquiéter autant. Certaines architectures, cependant, ajouter un trait de soulignement à un nom de variable; ainsi, "x" dans la source va devenir "_x" dans le binaire. Je n'en ai pas vu, mais il est possible qu'un compilateur C pourrait utiliser C++ name mangling comme un moyen d'attraper les erreurs de type au moment de la liaison, même sans surcharge. Mais la liaison est trop tard pour être utile.
OriginalL'auteur ZelluX
À la recherche à un commentaire que vous avez placé sur une précédente réponse ("[M]y question est simplement de savoir si nous pouvions appliquer
extern C
au niveau de la classe, de sorte que toutes les fonctions de la classe automatiquement a C style name mangling?", la réponse est "extern "C"
ne fonctionne pas de cette façon.'Point de vue syntaxique,
extern "C"
peut être appliquée à un seul état, un curly-bloc délimité par:Il est courant d'utiliser
extern "C"
avec le#ifdef __cplusplus
gardes sur l'ensemble C des en-têtes.Du point de vue sémantique, l'effet réel de l'application de
extern "C"
ne s'applique à la "normale" (c'est à dire, non-classe) les fonctions et les pointeurs de fonctions. Bien sûr, vous ne peut pas l'appliquer à un C++ template. Et vous ne pouvez l'appliquer à des méthodes de classe (parce qu'une méthode de la classe a besoin de savoir quel objet il a été appelé, et C-style de couplage n'a pas de toute façon de passer cette information à la fonction).Il est possible d'appliquer
extern "C"
sur les fonctions qui existent dans un espace de noms, mais les informations d'espace de noms vont tout simplement disparaître lorsqu'il est utilisé via C.Mise à jour
Si vous avez déjà une classe (nous allons utiliser une POD classe pour des raisons de simplicité), et que vous voulez le rendre utilisable à partir de C, vous aurez besoin d'appliquer
extern "C"
à une fonction appelable dans C. Malheureusement, cela devient laid, même dans les cas simples:À l'aide de gcc vous le compiler comme suit:
g++ try.cc -c -o try.o
gcc try.c try.o
Il y a quelques points importants:
new
oudelete
(ounew[]
oudelete[]
), vous devez lier le programme final pour le C++ runtime library (le commutateur de ligne de commande pour cette gcc est-lstdc++
.D'appeler le destructeur de manière explicite:
"Il est possible d'appliquer extern "C" sur les fonctions qui existent dans un espace de noms, mais les informations d'espace de noms vont tout simplement disparaître lorsqu'il est utilisé via C." -- excellent! J'ai appris quelque chose de nouveau! 🙂
OriginalL'auteur Max Lybbert
Ummm...
extern "C"
forces de style C de liaison. Il ne peut pas être utilisé avec les classes autant que je sache.Je crois qu'il ne peut pas être utilisé avec tout ce qui a des méthodes. Il devrait travailler avec les structures qui contiennent uniquement les données des membres et aussi longtemps qu'aucun des membres de données nécessitent la construction ou la destruction. Je n'ai pas accès à un environnement Windows, donc je suis en tournage de la hanche 🙂 Ma conjecture est que extern "C" ne fonctionne pas avec tout ce qui requiert un nom d'amputation donc des fonctions qui sont remplacées sont probablement trop. Selon ce que vous êtes en train de faire, il y a peut être une meilleure façon de le faire.
1. "J'imagine que extern "C" ne fonctionne pas avec tout ce qui requiert un nom d'amputation donc des fonctions qui sont remplacées sont probablement trop." -- extern C est utilisé pour appliquer la C le nom du style de déformation, mais pourquoi tu dis extern "C" ne fonctionne pas avec tout ce qui requiert un nom d'amputation? 2. "aussi longtemps qu'aucun des membres de données nécessitent la construction ou la destruction" -- la construction ou la destruction des moyens non-POD types de données qui n'ont pas ctor/dtor?
C linkers ne sont pas vraiment "mutilation noms" dans le sens traditionnel du terme. Tout au plus, ils seront préfixe d'un trait de soulignement pour le nom. C++ "name mangling" code de type d'information dans l'éditeur de liens symbole pour faire fonctionner les surcharges et les autres aliasing possible. "extern C" est mieux décrit comme la désactivation de C++ name mangling. Le résultat est que tout ce que le type de codage rend possible n'est plus possible. Donc, pas de surcharges, aucune méthode, aucun constructeur/destructeurs, etc. Vérifier en.wikipedia.org/wiki/Name_mangling pour une bonne description.
OriginalL'auteur D.Shawley