【问题标题】:Could we use extern "C" in C file without #ifdef __cplusplus?我们可以在没有#ifdef __cplusplus 的情况下在 C 文件中使用 extern "C" 吗?
【发布时间】:2012-03-18 22:28:26
【问题描述】:

为什么不应该为需要定义为 C 函数的函数指定 extern "C"?将文件编译为 C 源代码时会对编译器产生什么影响?

如果对 C 编译器没有影响,难道我们不能像下面这样在头文件中定义一个函数,去掉 #ifdef __cplusplus 的检查吗?

extern "C" {
    int MyFunc();
}

An answer to another question 说需要#ifdef,但我不明白为什么:

关于#2: __cplusplus 将为通过 C++ 编译器运行的任何编译单元定义。通常,这意味着 .cpp 文件和该 .cpp 文件包含的任何文件。如果不同的编译单元包含相同的 .h(或 .hh 或 .hpp 或 what-have-you),则可以在不同时间将它们解释为 C 或 C++。如果您希望 .h 文件中的原型引用 C 符号名称,则它们在被解释为 C++ 时必须具有 extern "C",并且在被解释为 C 时不应具有 extern "C" - 因此是 #ifdef __cplusplus检查。

【问题讨论】:

    标签: c++ c extern-c


    【解决方案1】:

    extern "C" 构造是 C++ 构造,C 编译器无法识别。通常,它会发出语法错误消息。

    一个常见的技巧是定义一个宏,例如 EXTERN_C,根据你是使用 C 还是 C++ 编译,它会扩展为不同的东西。例如:

    在普通头文件中:

    #ifdef __cplusplus
    #define EXTERN_C extern "C" {
    #define EXTERN_C_END }
    #else
    #define EXTERN_C
    #define EXTERN_C_END
    #endif
    

    在其他文件中:

    EXTERN_C
    int MyFunc(void);
    EXTERN_C_END
    

    【讨论】:

    • 谢谢。我不知道这是一个 C++ 构造。
    【解决方案2】:

    如果您将源文件编译为 C,它将识别extern "C",并且通常会导致编译错误。

    如果您将源文件编译为 C++,它识别extern "C",并链接正确的名称。

    因此,您只能可靠地使用它为您编译为 C++ 的文件指定 C 符号名称。

    如果您将源代码编译为 C 和 C++,或者您的接口是为 C 和 C++ 客户端设计的,则需要指定这种或另一种方式,以便客户端在链接时获得正确的符号(等等) .

    相关:您允许编写 extern "C++" - 用于 C++ 翻译。

    【讨论】:

      猜你喜欢
      • 2012-07-16
      • 2014-09-28
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 2011-03-18
      • 2021-08-09
      相关资源
      最近更新 更多