繁体   English   中英

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

[英]Where is the best place to put the #ifdef __cplusplus extern “C” { #endif

我想知道哪里更好

#ifdef __cplusplus
extern "C" {
#endif

在C头文件中。

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

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

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

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

此构造用于使您的名称可用于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_
  • 外部“C”影响联系。 当编译C ++函数时,它们的名称会有所不同,这就是为什么在C ++中进行重载是可能的。 因此,函数名称会根据参数的类型和数量进行修改,因此具有相同名称的两个函数将具有两个不同的符号名称。

  • extern“C”中的代码仍然是C ++代码。 你可以在extern“C”块中做些什么,但它们都是关于链接的。

extern "C"会影响代码的编译方式。 设计为C和C ++编译的标头将自己管理extern "C" 永远不应该在一个extern "C"块中包含一个#include指令:如果所涉及的头被设计为双向编译你的指令是多余的,如果它不是设计为双向使用它是一个错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM