放置#ifdef __cplusplus extern“C”的最佳位置在哪里{#endif

时间:2013-04-18 15:44:43

标签: c++ c include

我想知道把

放在哪里更好
#ifdef __cplusplus
extern "C" {
#endif

在C头文件中。

在开始或之后所有其他包括。为什么?

4 个答案:

答案 0 :(得分:12)

对此没有严格的规定,但请注意以下内容。

  1. 一般原则是每个头文件都自己处理(并且是自给自足的)。因此,根据这个原则,不需要将头文件包装在extern“C”中,因为头文件中会有一个extern“C”(如果需要的话)。因此,在当前文件中,您将把它放在另一个包含之后。
  2. 但是,如果你有一大堆标题,你不想添加一个extern“C”,并希望通过一个包括提供,通过各种方式,继续包装它们在文件范围的外部“C”。
  3. 只知道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"块中:如果涉及的标头被设计为双向编译,则指令是多余的,如果它不是设计的两种方式都是错误的。

相关问题