Was ist der Effekt von extern "C" in C ++?
Was genau macht putting extern "C"
in C++ - code zu tun?
Beispiel:
extern "C" {
void foo();
}
Kommentar zu dem Problem
Ich möchte Ihnen in diesem Artikel: http://www.agner.org/optimize/calling_conventions.pdf Es sagt viel mehr über die Aufrufkonvention und der Unterschied zwischen Compiler.
@Litherum Auf der Spitze von meinem Kopf, es sagt dem compiler zu kompilieren, der Umfang von code mit C, gegeben, dass Sie einen cross-compiler. Auch, es bedeutet, dass Sie eine Cpp-Datei, in dem Sie haben, dass
foo()
Funktion. InformationsquelleAutor der Frage Litherum | 2009-06-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
extern "C" macht eine Funktion-Namen in C++, 'C' - Verknüpfung (compiler nicht zerfleischen der name), so dass client C-code verlinken können (ich.e) Ihre Funktion mit einem 'C' - compatible-header-Datei enthält nur die Deklaration der Funktion. Ihre definition einer Funktion enthalten ist, die in einem binären format (kompiliert wurde durch Ihre C++ - compiler), die der client 'C' - linker wird dann link zu, mit dem 'C' Namen.
Da C++ das überladen von Funktionsnamen und C nicht, wird die C++ - compiler nicht nutzen Sie einfach den Namen der Funktion als eine eindeutige id zu verlinken, so dass es verstümmelt den Namen, indem Sie Informationen über die Argumente. Ein C-compiler muss nicht zerfleischen der name, da kann man nicht überlasten-Funktion Namen in C. Wenn Sie feststellen, dass eine Funktion extern "C" - Bindung in C++, der C++ - compiler nicht hinzufügen argument/parameter geben Informationen zu den verwendeten Namen für die Verknüpfung.
Nur damit Sie wissen, können Sie "C" Bindung an jede einzelne Deklaration/definition explizit oder verwenden Sie einen block, um der Gruppe eine Sequenz von Deklarationen/Definitionen, um eine bestimmte Bindung:
Wenn Sie kümmern sich um die Formalitäten, in der Sie aufgelistet sind, die in Abschnitt 7.5 von den C++03-standard, hier eine kurze Zusammenfassung (mit Betonung auf extern "C"):
alle Funktionstypen, Funktionsnamen und Variablennamen haben eine Sprache, die VerknüpfungSiehe Richards Kommentar: Nur Funktionsnamen und Variablennamen mit externe Bindung haben eine Sprache, die Verknüpfungextern "C" erzwingt eine Funktion haben externe Bindung (nicht statisch)Richard s Kommentar: 'statische' innen 'extern "C" " ist gültig; eine Entität so erklärt hat, die interne Verlinkung, also nicht eine Sprache, die VerknüpfungInformationsquelleAutor der Antwort Faisal Vali
Wollte nur hinzufügen, ein wenig info, da ich es noch nicht gesehen haben gebucht noch.
Wirst du sehr oft sehen-code in C-Header etwa so:
Was dies erreicht ist, die es erlaubt, Sie zu benutzen, dass die C-header-Datei mit dem C++ - code, weil das makro "__cplusplus" definiert werden. Aber Sie können auch immer noch verwenden Sie es mit Ihren legacy C-code, wo auch das makro ist NICHT definiert, damit es nicht zu sehen, die eindeutig C++ - Konstrukt.
Obwohl, ich habe auch gesehen, C++ - code wie:
, die ich mir vorstellen führt viel die gleiche Sache.
Nicht sicher, welcher Weg besser ist, aber ich habe gesehen, beide.
InformationsquelleAutor der Antwort UncaAlby
In jedem C++ - Programm, alle nicht-statischen Funktionen sind dargestellt in der Binär-Datei als Symbole. Diese Symbole sind Besondere Zeichenketten, die eindeutig identifiziert eine Funktion in das Programm.
In C, die symbol-name ist der gleiche wie der name der Funktion. Dies ist möglich, da in C keine zwei nicht-statische Funktionen können den gleichen Namen haben.
Weil C++ erlaubt das überladen und hat viele features, die C nicht — wie bei Klassen, member-Funktionen, exception - Spezifikationen ist es nicht möglich, verwenden Sie einfach den Namen der Funktion als der symbol-name. Um das zu beheben, C++, verwendet sogenannte name mangling, die verwandelt den Namen der Funktion und alle notwendigen Informationen (wie die Anzahl und Größe der Argumente) in einigen seltsam aussehenden Zeichenfolge verarbeitet nur durch den compiler und linker.
Also, wenn Sie eine Funktion angeben werden extern C der compiler nicht, führt die name manglings mit es und es kann direkt
über seine symbol-name der Funktion.
Das ist praktisch, während Sie mit
dlsym()
unddlopen()
für den Aufruf solcher Funktionen.InformationsquelleAutor der Antwort sud03r
Let ' s Dekompilierung des object-Datei g++ erzeugt, um zu sehen, was in dieser Implementierung.
Generieren Beispiel
Eingang:
Kompilieren mit GCC-4.8-Linux-ELF-Ausgang:
Dekompilieren der symbol-Tabelle:
Die Ausgabe enthält:
Interpretation
Sehen wir, dass:
ef
undeg
gespeichert wurden, in Symbole mit dem gleichen Namen wie im codedie anderen Symbole wurden entstellt. Lassen Sie uns unmangle Sie:
Fazit: beide der folgenden symbol-Typen wurden nicht entstellt:
Ndx = UND
), zur Verfügung gestellt werden, die zur link-oder zur Zeit von einem anderen Objekt-DateiSo müssen Sie
extern "C"
sowohl beim Aufruf:g++
zu erwarten unmangled Symbole produziert vongcc
g++
zu generieren unmangled Symbole fürgcc
zu verwendenDinge, die nicht funktionieren in extern C
Wird es offensichtlich, dass jede C++ - Funktion, die erfordert, dass die name manglings nicht wok-innen
extern C
:InformationsquelleAutor der Antwort Ciro Santilli 新疆改造中心 六四事件 法轮功
Ändert es die Verknüpfung einer Funktion in einer Weise, dass die Funktion aufrufbar ist, C. In der Praxis bedeutet das, dass der name der Funktion ist nicht verstümmelt.
InformationsquelleAutor der Antwort Employed Russian
Nicht alle C-header kompilieren wird mit extern "C". Wenn Bezeichner in einem C-header-Konflikt mit einem C++ - Schlüsselwörter C++ - compiler wird sich beschweren, über diese.
Zum Beispiel habe ich gesehen, wie Sie den folgenden code ein Fehler in einer g++ :
Irgendwie Sinn macht, aber es etwas im Auge zu behalten bei der Portierung von C-code nach C++.
InformationsquelleAutor der Antwort Sander Mertens
C++ verstümmelt Funktionsnamen erstellen einer Objekt-orientierten Sprache eine prozedurale Sprache
Meisten Programmiersprachen sind nicht gebaut auf der Spitze des bestehenden Programmiersprachen. C++ baut auf der Spitze des C, und ferner ist eine Objekt-orientierte Programmier-Sprache gebaut, aus einer prozeduralen Programmiersprache, und aus diesem Grund sind C++ keywords wie
extern
die rückwärts-Kompatibilität mit C.Betrachten wir das folgende Beispiel:
Einen C-compiler nicht kompilieren Sie das Beispiel oben, weil die gleiche Funktion
printMe
definiert ist zweimal (auch wenn Sie unterschiedliche Parameter habenint a
vschar a
).Einem C++ compiler kompilieren Sie das obige Beispiel. Es kümmert sich nicht, dass
printMe
definiert ist doppelt.Dies ist, weil ein C++ - compiler implizit benennt (verstümmelt) Funktionen basierend auf Ihren Parametern. In C wurde diese Funktion nicht unterstützt. Allerdings, wenn C++ gebaut wurde, über C, die Sprache, die entworfen wurde, um Objekt-orientiert und benötigt zur Unterstützung der Fähigkeit zu erstellen, die verschiedenen Klassen mit Methoden (Funktionen) mit dem gleichen Namen, und das überschreiben von Methoden (Methode überschreiben) basierend auf unterschiedlichen Parametern.
Extern sagt "don' T mangle-Funktion Namen"
Jedoch vorstellen, dass wir ein Erbe C-Datei mit dem Namen "Eltern.c", die
include
s-Funktion Namen aus anderen legacy-C-Dateien "Eltern.h", "Kind.h", etc. Wenn das Erbe "Eltern.c" - Datei ist eine C++ - compiler, dann wird der Funktion werden Namen verstümmelt, und Sie werden nicht mehr mit der Funktion angegebenen Namen in "Eltern.h", "Kind.h", etc - also die Funktion von Namen in diesen externen Dateien müssten verstümmelt als gut. Und dieses könnte ziemlich chaotisch. So könnte es bequem sein, um eine keyword-die können feststellen, dass der C++ - compiler nicht zu zerfleischen name einer Funktion.Den
extern
Schlüsselwort sagt ein C++ - compiler nicht zu 'zerfleischen' (umbenennen) - Funktion Namen. Beispiel:extern void printMe(int a);
InformationsquelleAutor der Antwort tfmontague
Informiert er den C++ - compiler, um die Namen dieser Funktionen in einem C-style bei der Verlinkung, denn die Namen der Funktionen zusammengestellt, die in C und C++ sind unterschiedliche bei der Verlinkung der Bühne.
InformationsquelleAutor der Antwort Mark Rushakoff
extern "C" gemeint ist, erkannt zu werden, die von einem C++ - compiler, und informiert den compiler, dass die erwähnte Funktion ist (oder zu sein), zusammengestellt im C-Stil. So dass, während die Verknüpfung, link auf die richtige version der Funktion aus C.
InformationsquelleAutor der Antwort Flami
Benutzte ich "extern " C"', bevor Sie für die dll(dynamic link library) - Dateien zu machen etc. main () - Funktion "exportierbar", so kann es später in ein anderes ausführbares Programm von der dll.
Vielleicht ein Beispiel, wo ich nützlich sein kann.
DLL
EXE
InformationsquelleAutor der Antwort SturmCoder
extern "C"
ist die Verknüpfung Spezifikation die verwendet wird, um Aufruf von C-Funktionen in der Cpp-Quelldateien. Wir können Aufruf von C-Funktionen, Variablen schreiben, & include Header. Funktion deklariert ist extern entity & es ist außerhalb von Ihnen definiert werden. Syntax istTyp 1:
Typ 2:
zB:
InformationsquelleAutor der Antwort Yogeesh H T
Beim mischen von C und C++ (d.h., ein. Aufruf der C-Funktion aus C++; und b. aufrufen von C++ - Funktion aus C), die C++ name mangling Ursachen verknüpfen Probleme. Technisch gesehen, dieses Problem tritt nur auf, wenn die aufgerufene Funktionen wurden bereits für Sie zusammengestellt binären (wahrscheinlich eine *.eine Bibliothek-Datei) mit den entsprechenden compiler.
Also müssen wir mit extern "C" zu deaktivieren, der name mangling in C++.
InformationsquelleAutor der Antwort Trombe