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

Vin*_*ent 10 c c++ include

我想知道哪里更好

#ifdef __cplusplus
extern "C" {
#endif
Run Code Online (Sandbox Code Playgroud)

在C头文件中.

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

Zif*_*ion 12

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

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

只知道extern"C"背后的想法是它使编译器生成C友好链接.否则,使用C++编译器编译的代码会查找在使用C编译器编译的存档中链接的错位名称,并且无法找到它们.

  • 第三个例子:实际上,有一些C库,其作者并不关心C++,只是忽略了外部的"C".您现在宁愿修改外部标题还是包含由您自己的'extern"C"包裹的未修改标题?我个人更喜欢后者...... (2认同)

Off*_*rmo 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_
Run Code Online (Sandbox Code Playgroud)