extern "C" extern foo()



  • Hallo,

    ich habe eine Funktion, die ich doppelt externen muss.

    extern "C" extern foo();
    

    Hier meckert aber der Compiler:

    error: invalid use of ‘extern’ in linkage specification
    

    😕


  • Mod

    §7.5/7 schrieb:

    A declaration directly contained in a linkage-specification is treated as if it contains the extern specifier (7.1.1) for the purpose of determining the linkage of the declared name and whether it is a definition.
    Such a declaration shall not specify a storage class.



  • Also, durch 'extern "C"' ist die ganze Funktion sowieso 'extern', und das zweite 'extern' ist überflüssig?
    Habe ich das richtig interpretiert?

    Richtig müsste es also so aussehen:

    extern "C" foo()
    

  • Mod

    Jo.



  • Hmm, das ist aber doof.
    Gibt's da vielleicht noch eine andere Lösung?

    Mein Problem ist, daß ich einen C-Header verwende und diesen einfach für C++ "externiere".

    #ifdef __cplusplus
    extern "C" {
    #endif
    
    extern foo();
    
    #ifdef __cplusplus
    }
    #endif
    

    Der Header wird auch von C-Dateien genutzt, weshalb ich nicht einfach das 'extern' von foo() rausschmeißen kann.

    Jmd 'ne Idee?


  • Mod

    #ifdef __cplusplus
    #   define EXTERN extern
    #else
    #   define EXTERN
    #endif
    

    ?



  • olpo schrieb:

    Der Header wird auch von C-Dateien genutzt, weshalb ich nicht einfach das 'extern' von foo() rausschmeißen kann.

    Ist das "normale" extern nicht sowieso implizit wenn man nicht static dranschreibt? Zumindest in C++ ist das so und ich bin mir auch recht sicher, dass es in C auch so ist.


  • Mod

    @sebi: Oh, hast recht:

    C11, §6.2.2/5 schrieb:

    If the declaration of an identifier for a function has no storage-class specifier, its linkage is determined exactly as if it were declared with the storage-class specifier extern .


Anmelden zum Antworten