#ifdef



  • Hallo,
    was bedeutet den folgende Definition:

    #ifdef __cplusplus
    extern "C" {
    #endif
    

    falls man z.B. eine c++ Funktion hat soll man die mit _cplusplus markieren?
    und was passiert dann?
    Koenntet Ihr mich vielleicht aufklaeren damit Licht ins Dunkle kommt!



  • Das Symbol __cplusplus ist automatisch definiert wenn ein C++-Compiler den Code compiliert (im Gegensatz zu einem C Compilern).
    Durch testen gegen diese Symbol kann man also C++-spezifische Sachen bedingt compilieren.
    Das wird verwendet, wenn man Code benutzen möchte, der sowohl von C-Compilern als auch von C++-Compilern übersetzt werden soll.
    (z.B. für Header-files nützlich)
    Genau dies ist auch im Besipiel der Fall. Hier möchte man alle nachfolgenden Definition mit extern "C" versehen, aber nur wenn es sich um einen C++-Compiler handelt.
    (Ein C-Compiler wüsste mit extern "C" nichts anzufangen!)



  • ja , vielen Dank fuer die nuetzliche Hilfe.

    Das Symbol __cplusplus ist automatisch definiert wenn ein C++-Compiler den Code compiliert

    Heisst automatisch defineiert, dass der C++ Compiler den Code selber hinzufuegt?



  • Nicht den Code. Das Makro __cplusplus.



  • Die Bedeutung der Definition:

    #if defined(__cplusplus)
    extern "C"{
    #endif
    
    .....eine beliebige Anzahl von Funktionsprototypen
    
    #if defined(__cplusplus)
    }
    #endif
    

    Sie dient dazu das bei C++-Compilern nötige Namemangling abzuschalten.

    Wenn man eine Funktion

    int test(float a)
    {
    ...
    return 0;
    }
    

    mt C++ compiliert werden vom Compiler Kennungen für die Variablentypen dem Funktionsnamen vorangestellt, dies ist nötig weil man sosnt keine Overloading machen kann. Der C-Compiler macht so etwas nicht

    Die Funktionen werden mit diesen Namemangling Namen in das obj File gepackt.

    Wenn ich jetzt versuche diese Funktionen in reinen C-Projekt zu nutzen findet der Linker die Funktionen nicht da er als C-Compiler nach den Namen ohne das Manfling sucht.

    Mit der obigen Definition wird der C++-Compiler angewiesen auf das Name mangling zu verzichten.

    Die meisten Bibliotheken die im Handel sind und die in C und C++ genutzt werden
    haben und brauchen diese Definition bei den Funktions Prototypen. Dies gilt auch für die Bibiotheken aller Windowsumgebungen.

    Man kann das gleiche erreichen in dem man einer einzelnen Funktionsdeklaration

    extern "C" int printf( const char *, ... );
    

    voranstellt
    😉


Anmelden zum Antworten