PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c++, was is das für ein ding?


Gast
2011-04-02, 15:21:48
Nachdem ich mir die Grundkenntnisse von C++ einigermaßen angeeignet habe, wollte ich nun etwas Code von erfahrenen Leuten studieren. Dabei bin ich auf eine "Konstruktion" gestoßen die ich mir so nicht erklären kann.
Es handel sich um diese Zeile - " extern "C" { " - dieses Codes:

#ifdef __cplusplus
extern "C" {
#endif

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main(int argc, char *argv[])
#endif
{
// Create application object
TutorialApplication app;

try {
app.go();
} catch( Ogre::Exception& e ) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
std::cerr << "An exception has occured: " <<
e.getFullDescription().c_str() << std::endl;
#endif
}

return 0;
}

#ifdef __cplusplus
}
#endif


Was ist das? Ich weiß zwar was extern macht aber ich bin absolut ratlos was "C" hier zu suchen hat und was es denn bringt...
Bitte um Erklärung!

Exxtreme
2011-04-02, 15:36:55
Ich bin zwar kein C++-Profi aber soviel ich weiss dient das dazu, dass der C++-Compiler als Symbolnamen nur den Funktionsnamen verwenden soll. Normalerweise benutzt er dazu auch noch die Parameter der Funktion/Methode damit er beim Überladen der Funktionen/Methoden nicht durcheinander kommt. Mit "extern C" unterdrückt man dieses Verhalten und es wird ausschliesslich der Funktionsname verwendet und die Parameter der Funktion werden verworfen.

Vorteil ist, man kann das dann auch mit reinen C-Compilern verwenden, die C++ nicht können. Und ich glaube, auch bei dynamisch ladenden Bibliotheken (DLL) kann man besser compiler-übergreifend arbeiten da Funktionsnamen als Symbolnamen der kleinste gemeinsame Nenner sind.

Coda
2011-04-02, 20:28:41
So ungefähr. Alles in extern "C" wird mit einer C-Signatur anstelle der C++-Signatur definiert. Dabei hat man dann auch alle Restriktionen von C (keine Funktions-Überladung, keine Template-Typen etc.)

Das dient dazu gegen C-Bibliotheken linken zu können. Also sowohl externe C-Funktionen zu benutzen oder Funktionen so zu exportieren, das sie von C verwenden werden können.