Libraries extern "C" in C++



  • Hallo Gemeinde,

    ich habe eine Menge Code den ich nun in eine Lib auslagern muss, da er nun von einem 2. Projekt gebraucht wird... Wenn ich Libs zur laufzeit meines Programms lade, arbeite ich bei den Libs mit extern "C" nach diesem Tutorial: http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

    Wenn ich jetzt aber eine Lib baue, die gegen das Programm gelinkt wird, (nur für gcc und nur Linux) Muss ich da auch mit extern "C" rumfuchteln, oder kann ich mir das schenken? Ich gebe zu ich verstehe bis heute noch nicht so richtig wozu extern "C" gut ist... Wenn jemand da einen guten Link hätte wäre ich da auch dankbar...

    so long
    jd



  • Das extern "C" sorgt im Prinzip dafür, das die Funktion als C Funktion erstellt wird. Bei C++ gibt es (für x86) keine festgelegte ABI, was dazu führt das Code von verschiedenen Compilern (und teilweise sogar nur verschiedene Versionen) nicht miteinander kompatibel ist, und sich nicht gegenseitig aufrufen kann. Bei DLLs ist es durchaus möglich, dass Programm und DLL von verschiedenen Compilern gebaut werden, weswegen man auf die C Schnittstelle zurückgreift.

    Bei statischen Libs, wo du auch noch weißt das für Programm und Lib der gleiche Compiler genutzt wird, ist es in der Regel überflüssig.



  • Soweit ich weiss betrifft das nur das sogenannte "name mangling" was für den Linker wichtig ist.

    C Funktionen bekommen einen 'einfachen' internen Namen zum Linken, in der Reglel sehr ähnlich dem eigentlichen Funktionsname.

    c++ Funktionen erhalten zusätzlich noch eine Signatur,
    welche die Aufrufparameter abbildet.

    z.B.

    int function (int);
    int function (char);
    

    sind unter c++ zwei verschiedene Funktionen.
    unter C ist soetwas nicht möglich.

    extern "C" unterdückt damit in c++ Code diese zusätzliche Signatur.
    reine C Header sollten extern "C" verwenden, damit man die Funktionen auch von c++ verwenden kann.

    Gruß Frank



  • Frank Erdorf schrieb:

    Soweit ich weiss betrifft das nur das sogenannte "name mangling" was für den Linker wichtig ist.

    Es kann auch eine andere "Aufrufkonvention" sein. Man kann sich also nicht darauf verlassen dass zB Funktionszeiger zwischen C und C++ kompatibel sind, soweit ich weiß.



  • c++ Funktionszeiger können von c aus aufgerufen werden.
    Das habe ich schon öfters verwendet, ob das am extern "C" liegt weiß ich nicht.

    Ich habe von c aus schon statische c++ Klassen Funktionen
    und statische c++ Funktionen über Funktionszeiger aufgerufen.
    Über einen Umweg habe ich sogar schon c++ Klassen Funktionen aufgerufen.

    Es scheint nicht, daß die "Aufrufkonvention" anders ist.

    Gruß Frank



  • Frank Erdorf schrieb:

    Es scheint nicht, daß die "Aufrufkonvention" anders ist.

    Kommt halt drauf an, welche du verwendest :p


Log in to reply