extern "C"
-
hallo! ich lese gerade eine komplex C-Code(ich glaube, das ist ein C-Code
)
ja! bis ich auf eine header datei gestoßen bin, und dort steheextern "C"
das kenne ich gar nicht, was bedeutet das? und habe gegoogelt, sehr viele Erklärungen sind auf C++ bezogen. Ohje!! ist das Code überhaupt noch ein C Code?
hier sieht ganz so aus:
#ifdef __cplusplus extern "C" { #endif .... // code #ifdef __cplusplus } #endif
sind die beide '{' '}' auf den falschen stelle?
-
^^ der code ist für beides. ein cpp-kompiler muss wissen, dass das C-funktionen sind. sonst kann er sie nicht aufrufen (der linker findet sie sonst nicht). unter C hat "extern C" keine bedeutung. und das #define __cplusplus existiert da auch nicht.
-
heißt das, dass die Code ist für beide Compiler gedacht, und um die Fehler bei complieren zu vermeiden, wird eine
extern "C"
benutzt, dem Computer zu sagen, hier ist das für C-Complier, wenn gerade unter C++ arbeitet. und wenn unter C-Compiler, hat das kein Bedeutung, kann ich auch weglassen.
habe ich das richtig verstanden?
-
gy100002000 schrieb:
hier ist das für C-Complier, wenn gerade unter C++ arbeitet. und wenn unter C-Compiler, hat das kein Bedeutung, kann ich auch weglassen.
habe ich das richtig verstanden?ja, genau. c++ compiler haben ein vordefiniertes präprozzi-symbol
#ifdef __cplusplus // das hier sehen nur compiler für diese fricklersprache cout << ... template <typename ... virtual class &ref ... #else // das hier sieht nur ein richtiger c-compiler long *x = malloc (... #endif
-
Danke für die schnell Antworten!!
und noch eine Sachen, und zwar: warum muss vor "cplusplus" zwei "_" stehen. ist das nur eine formlich Sachen, oder das ist auch eine bestimmt Befehl?
weil ich in mein Code so was haben:int __start algo(void);
dort habe ich auch "__" , naja, bis jetzt habe ich so was noch nicht benutzt, warum muss noch vor die FKT definition noch so eine Zeichen stehen?
das ist auch in meine header datei.
-
_ ist ein zeichen, wie jedes andere auch. viele nehmen das, um künstliche spaces einzubauen. normalerweise sind bezeichenr die mit _ und __ anfangen für compiler-interne #defines und variablen, etc. reserviert.
-
ok! danke!
-
würde ich bspw. in einer c++ funktion schreiben
long *x = malloc (... );
was ja C ist... und ich würde in der header " extern "C" " weglassen, würde das der compiler ja trozdem schucken ohne das extern "C"
-
frage extern schrieb:
würde ich bspw. in einer c++ funktion schreiben
long *x = malloc (... );
was ja C ist... und ich würde in der header " extern "C" " weglassen, würde das der compiler ja trozdem schucken ohne das extern "C"
in irgendeiner .h ist malloc als 'extern "C"' für den cpp compiler deklariert. deshalb kann's der linker finden.
siehe auch: http://en.wikipedia.org/wiki/Name_mangling
...aber dein code tuts trotzdem nicht unter c++, weil diese hirnamputierte grützensprache einen type-cast vor malloc erwartet.