何时以简单的词语使用extern“C”?

这个问题在这里已经有了答案:

  • C ++中extern“C”的效果是什么? 12个答案

  • 当声明一个在C中实现/编译的函数时,需要在C ++中使用extern "C" 。使用extern "C"告诉编译器/链接器使用C命名和调用约定,而不是C ++名称修饰, C ++调用约定,否则将被使用。 对于其他库提供的函数,几乎不需要使用extern "C" ,因为编写良好的库已经具有用于输出到C和C ++的公共API的内容。 但是,如果你编写一个你想在C和C ++中都可用的库,那么你必须有条件地将它放在你的头文件中。

    至于是否所有的C代码都是C ++代码...不,这是不正确的。 C ++是“C的超集”是一个流行的神话。 尽管C ++尽力与C兼容,但还是有一些不兼容的地方。 例如,bool是有效的C ++,但不是有效的C,而_Bool存在于C99中,但在C ++中不可用。

    至于是否需要将extern“C”与系统的“.h”文件一起使用......任何设计良好的实现都会为您提供这些内容,以便您不需要使用它们。 但是,为了确保提供它们,您应该包含以“c”开头并且省略“.h”的等效头文件。 例如,如果包含<ctype.h>,几乎任何合理的系统都会添加外部“C”; 然而,为了确保一个C ++兼容的头文件,你应该包含头文件<cctype>。

    您也可能对C ++ FAQ Lite中的C和C ++混合感兴趣。


    其他答案是正确的,但完整的“样板”示例可能会有所帮助。 将C代码包含在C和/或C ++项目中的规范方法如下所示:

    //
    // C_library.h
    //
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    //
    // ... prototypes for C_library go here ...
    //
    
    #ifdef __cplusplus
    }
    #endif
    

    -

    //
    // C_library.c
    //
    
    #include "C_library.h"
    
    //
    // ... implementations for C_library go here ...
    //
    

    -

    //
    // C++_code.cpp
    //
    
    #include "C_library.h"
    #include "C++_code.h"
    
    //
    // ... C++_code implementation here may call C functions in C_library.c ...
    //
    

    注意:以上也适用于从Objective-C ++调用C代码。


    C ++编译器在符号表中的名称与C编译器不同。 您需要使用extern "C"声明来告诉C ++编译器在构建符号表时使用C修改约定。

    链接地址: http://www.djcxy.com/p/40479.html

    上一篇: When to use extern "C" in simple words?

    下一篇: safe in C++11?