Was ist das: extern "C"
-
Hi,
ich habe jetzt schon sehr sehr oft folgendes gesehen:
extern "C" void meine_funktion () { // mach was } // ----- extern "C" int _fldused = 0; // ----- extern "C" void irgendeine_funktion_die_in_ner_lib_implementiert_wurde ();
Meine Frage ist nun: Wofür ist das, wieso benutzt man das, warum benutzt man das und was kann man damit alles machen?
Danke euch im voraus
-
extern "C" schaltet die Namenszerstückelung aus. Damit kannst du auf Funktionen aus einen C-Bibliothek zugreifen bzw. deine Funktione von C aus aufrufbar machen.
-
Was für eine Namenszerstückelung und wieso sollte ich die aus C aufrufbar machen, wenns doch eigentlich C ist?!
nimms mir nicht übel, aber irgendwie ist mir das noch viel zu allgemein und unverständlich
-
Hmm ... es ist eher die Frage wie das aussieht wenn du dir es in Assembly anguckst ^^ Dann wird es sonnst lustig, wenn du einen C++-Compiler nimmst und Funktionen die dabei rauskommen dann in einem Assembly-Code nutzen willst
Gibt da nämlich keine einheitliche Norm, wie der Compiler die Funktionen aussehen lassen soll ... MSVC++ macht bsw. da andere Sachen als der GXX ...
-
Mojon schrieb:
Was für eine Namenszerstückelung und wieso sollte ich die aus C aufrufbar machen, wenns doch eigentlich C ist?!
nimms mir nicht übel, aber irgendwie ist mir das noch viel zu allgemein und unverständlich
Das war eigentlich ziemlich präziese, unverständlich vielleicht für dich
Die sache ist, dass C++ die Funktionen in den Objektdateien (.o oder .obj) anders benennt, als C. Wenn du extern "C" verwendest, benutzt der Compiler die C Namensgebung der Funktionen.
-
Okay, aber was für einen Effekt hat das bei Variablen?
-
Mojon schrieb:
Okay, aber was für einen Effekt hat das bei Variablen?
anscheinend gibt es auch einen "Mangled Name" für Variablen in C++
-
Vertexwahn schrieb:
Mojon schrieb:
Okay, aber was für einen Effekt hat das bei Variablen?
anscheinend gibt es auch einen "Mangled Name" für Variablen in C++
Die Namensräume werden ebenfalls einkodiert.
-
Gibt es dazu irgendwo weiterführende Links? Nehmt es mir nicht übel, aber was hier gesagt wurde reicht mir nicht aus, es ist mir alles nicht konkret bzw. stichhaltig genug.
-
void foo(); void foo(int); namespace Bar { void foo(); } class Baz { void foo(); }
Diese foos wollen in C++ alle unterschieden werden. Also nennt der Compiler sie um in kryptischere, implementationsabhängige Namen (Stichwort: Name Mangling). In C gabs das nicht, da konnten die Funktionen einfach ihren Namen behalten. Wenn du nun C-Code in C++ benutzen willst, verträgt ers nicht, wenn die Namen verändert werden. Deshalb sagt man dem Compiler mit
extern "C"
, dass er die Namen doch bitte so lassen soll, wie sie sind.
-
http://en.wikipedia.org/wiki/Name_mangling
war übrigens der erste beitrag bei google...
-
Michael E. schrieb:
void foo(); void foo(int); namespace Bar { void foo(); } class Baz { void foo(); }
Diese foos wollen in C++ alle unterschieden werden. Also nennt der Compiler sie um in kryptischere, implementationsabhängige Namen (Stichwort: Name Mangling). In C gabs das nicht, da konnten die Funktionen einfach ihren Namen behalten. Wenn du nun C-Code in C++ benutzen willst, verträgt ers nicht, wenn die Namen verändert werden. Deshalb sagt man dem Compiler mit
extern "C"
, dass er die Namen doch bitte so lassen soll, wie sie sind.Also wenn ich das richtig verstehe würde folgendes nicht gehen:
extern "C" void foo (void) { printf ("%s", __FUNCTION__); } extern "C" void foo (int wert) { printf ("%s:%d", __FUNCTION__, wert); }
Da es in C keine Funktionsüberladung oder sonstige Polymorphie gab?
-
[quote="Mojon"]
Michael E. schrieb:
void foo(); vwenn ich das richtig verstehe würde folgendes nicht gehen: [cpp] extern "C" void foo (void) { printf ("%s", __FUNCTION__); } extern "C" void foo (int wert) { printf ("%s:%d", __FUNCTION__, wert); }
Da es in C keine Funktionsüberladung oder sonstige Polymorphie gab?
genau - das sollte laut dem Wikipedia Artikel nicht funktionieren... (allerdings sollte man da vorsichtig sein - Der C Standard entwickelt sich auch weiter - da wurde z. B. der Datentyp bool eingeführt, usw. ich kann mir auch vorstellen das da entzwischen auch schon Polymorphie für Funktionen eingeführt wurde...)