14

我想知道放哪里比较好

#ifdef __cplusplus
extern "C" {
#endif

在 C 头文件中。

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

4

4 回答 4

15

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

  1. 一般原则是每个头文件都会自行处理(并且是自给自足的)。因此,根据这个原则,不需要将头文件包装在 extern "C" 中,因为头文件中会包含一个 extern "C"(如果需要的话)。因此,在当前文件中,您可以将其放在其他包含之后。
  2. 但是,如果你确实有一大堆标题,你不想添加一个外部“C”,并且想通过单个包含提供,无论如何,继续将它们包装在一个文件中宽外部“C”。

只知道 extern "C" 背后的想法是它使编译器生成 C 友好的链接。否则,使用 C++ 编译器编译的代码会在使用 C 编译器编译的存档中查找要链接的损坏名称,但找不到它们。

于 2013-04-18T15:58:58.913 回答
13

此构造用于使您的名称可用于 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_
于 2013-04-18T15:47:18.263 回答
2
  • extern "C" 影响链接。编译 C++ 函数时,它们的名称会有所不同,这就是 C++ 中可以重载的原因。因此,函数名称会根据参数的类型和数量进行修改,因此具有相同名称的两个函数将具有两个不同的符号名称。

  • extern "C" 中的代码仍然是 C++ 代码。在外部“C”块中可以做的事情是有限制的,但它们都是关于链接的。

于 2013-10-04T09:33:29.100 回答
1

extern "C"影响代码的编译方式。设计为同时编译为 C 和 C++ 的头文件将extern "C"自行管理。您永远不#include应该将指令包装在extern "C"块中:如果所涉及的标头设计为双向编译,则您的指令是多余的,并且如果它不是设计为双向使用,那就是错误。

于 2013-04-18T15:52:26.083 回答