也许我不理解C和C++之间的差异,但我们何时以及为什么需要使用
extern "C" {
Run Code Online (Sandbox Code Playgroud)
?显然它是一个"联系会议".
我简单地阅读了它,并注意到MSVS附带的所有.h头文件都包含它们的代码.什么类型的代码到底是"C代码"而不是"C++代码"?我以为C++包含了所有的C代码?
我猜这不是这种情况,C++是不同的,标准特性/功能存在于一个或另一个中,但不是两个(即:printf是C和cout是C++),但是C++是向后兼容的,尽管外部"C"声明.它是否正确?
我的下一个问题取决于第一个问题的答案,但无论如何我会在这里问:由于用C语言编写的MSVS头文件被extern"C"{...}包围,你什么时候需要使用它你自己的代码?如果您的代码是C代码并且您正在尝试在C++编译器中编译它,那么它是否应该没有问题,因为您包含的所有标准h文件在C++编译器中已经有了外部"C"的东西?
在C++中编译但是链接到已经构建的C库或其他东西时,你是否必须使用它?
Mic*_*yan 30
extern "C"在声明用C实现/编译的函数时,需要在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++中不可用.
至于你是否需要在系统的".h"文件中使用extern"C"......任何精心设计的实现都会为你提供那些,所以你不需要使用它们.但是,为了确保提供它们,您应该包含以"c"开头并省略".h"的等效头文件.例如,如果包含<ctype.h>,几乎任何合理的系统都会添加extern"C"; 但是,要确保与C++兼容的标头,您应该包含标头<cctype>.
您可能还对C++ FAQ Lite中的混合C和C++感兴趣.
Pau*_*l R 17
其他答案是正确的,但完整的"样板"示例可能会有所帮助.在C和/或C++项目中包含C代码的规范方法如下:
//
// C_library.h
//
#ifdef __cplusplus
extern "C" {
#endif
//
// ... prototypes for C_library go here ...
//
#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)
-
//
// C_library.c
//
#include "C_library.h"
//
// ... implementations for C_library go here ...
//
Run Code Online (Sandbox Code Playgroud)
-
//
// C++_code.cpp
//
#include "C_library.h"
#include "C++_code.h"
//
// ... C++_code implementation here may call C functions in C_library.c ...
//
Run Code Online (Sandbox Code Playgroud)
注意:以上内容也适用于从Objective-C++调用C代码.