我想知道把
放在哪里更好#ifdef __cplusplus
extern "C" {
#endif
在C头文件中。
在开始或之后所有其他包括。为什么?
答案 0 :(得分:12)
对此没有严格的规定,但请注意以下内容。
只知道extern“C”背后的想法是它使编译器生成C友好链接。否则,使用C ++编译器编译的代码会查找在使用C编译器编译的存档中链接的错误名称,但无法找到它们。
答案 1 :(得分:11)
此构造用于使您的名称可用于C链接器(简短说明)
所以显然你只想在你的东西周围使用它。
像这样:
#ifndef MY_INCLUDE_H_ // include guard
#define MY_INCLUDE_H_
#include <...> // dependencies
#include "..."
#ifdef __cplusplus
extern “C” {
#endif
// ... your types, methods, variables
#ifdef __cplusplus
}
#endif
#endif // MY_INCLUDE_H_
答案 2 :(得分:2)
extern“C”影响联系。当编译C ++函数时,它们的名称会有所不同,这就是为什么在C ++中进行重载是可能的。因此,函数名称会根据参数的类型和数量进行修改,因此具有相同名称的两个函数将具有两个不同的符号名称。
extern“C”中的代码仍然是C ++代码。你可以在extern“C”块中做些什么限制,但它们都是关于链接的。
答案 3 :(得分:1)
extern "C"
会影响代码的编译方式。 设计的标题可以作为C和C ++编译,它们将自己管理extern "C"
。您应该从不将#include
指令包装在extern "C"
块中:如果涉及的标头被设计为双向编译,则指令是多余的,如果它不是设计的两种方式都是错误的。