How does an extern “C” declaration work?

后端 未结 9 738
礼貌的吻别
礼貌的吻别 2020-12-02 14:33

I\'m taking a programming languages course and we\'re talking about the extern \"C\" declaration.

How does this declaration work at a deeper level othe

相关标签:
9条回答
  • 2020-12-02 15:19

    When you flag a block of code with extern "C", you're telling the system to use C style linkage.

    This, mainly, affects the way the linker mangles the names. Instead of using C++ style name mangling (which is more complex to support operator overloads), you get the standard C-style naming out of the linker.

    0 讨论(0)
  • 2020-12-02 15:19

    Here is a quote from msdn

    "The extern keyword declares a variable or function and specifies that it has external linkage (its name is visible from files other than the one in which it's defined). When modifying a variable, extern specifies that the variable has static duration (it is allocated when the program begins and deallocated when the program ends). The variable or function may be defined in another source file, or later in the same file. Declarations of variables and functions at file scope are external by default."

    http://msdn.microsoft.com/en-us/library/0603949d%28VS.80%29.aspx

    0 讨论(0)
  • 2020-12-02 15:27

    extern C affects name mangling by the C++ compiler. Its a way of getting the C++ compiler to not mangle names, or rather to mangle them in the same way that a C compiler would. This is the way it interfaces C and C++.

    As an example:

    extern "C" void foo(int i);
    

    will allow the function to be implemented in a C module, but allow it to be called from a C++ module.

    The trouble comes when trying to get a C module to call a C++ function (obviously C can't use C++ classes) defined in a C++ module. The C compiler doesn't like extern "C".

    So you need to use this:

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

    Now when this appears in a header file, both the C and C++ compilers will be happy with the declaration and it could now be defined in either a C or C++ module, and can be called by both C and C++ code.

    0 讨论(0)
提交回复
热议问题