何时以简单的词语使用extern“C”?
这个问题在这里已经有了答案:
当声明一个在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修改约定。
上一篇: When to use extern "C" in simple words?
下一篇: safe in C++11?