何时使用extern "C"的简单解释?
何时使用extern "C"的简单解释?
这个问题的答案已经在这里了:
也许我没有理解 C 和 C++ 之间的区别,但是我们何时以及为什么需要使用
extern "C" {
?显然它是一种“链接约定”。
我简要地阅读了一下它,并注意到 MSVS 附带的所有 .h 标头文件都将其代码包围在其中。什么样的代码是“C 代码”,而不是“C++ 代码”?我以为 C++ 包括所有的 C 代码?
我猜这不是情况,并且 C++ 是不同的,某些标准的特性/函数存在于一个语言中但不存在于另一个语言中(例如:printf 在 C 中是存在的,而 cout 在 C++ 中是存在的),但是通过 extern \"C\" 声明,C++ 是向后兼容的。这样正确吗?
我的下一个问题取决于第一个问题的答案,但是我仍然在这里问一下:因为使用 C 编写的 MSVS 标头文件都用 extern \"C\" { ... } 包围,那么什么时候您需要在自己的代码中使用它呢?如果您的代码是 C 代码,并且您正在尝试在 C++ 编译器中编译它,那么它不应该有问题,因为您包含的所有标准头文件都已经有了 extern \"C\" 的声明在其中,即使在 C++ 编译器中也是如此吗?
您需要在使用 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\"。使用\"extern C\"告诉编译器/链接器使用C的命名和调用规范,而不是使用C++名称重整和C++调用约定。对于提供的其他库函数,您几乎永远不需要使用\"extern C\",因为编写良好的库已经为它导出到C和C++的公共API中添加了这个内容。如果您编写了一个既要在C中也要在C++中可用的库,那么您将必须有条件地在头文件中添加这个内容。\n\n至于是否所有的C代码都是C++代码...不是的。一个流行的神话是C++是\"C的超集\"。虽然C++努力使自己尽可能与C兼容,但是还存在一些不兼容性。例如,\"bool\"是有效的C++,但不是有效的C,而\"_Bool\"存在于C99中,但在C++中不可用。\n\n至于您是否会需要使用extern \"C\"与系统的\".h\"文件...任何良好设计的实现都会为您提供这些文件,因此您不需要使用它们。但是,为确保它们被提供,您应该包括以\"c\"开头并省略\".h\"的等效头文件。例如,如果包括ctype.h,几乎任何合理的系统都会添加extern \"C\";然而,为了确保具有C++兼容头文件,您应该包括头文件