gpt4 book ai didi

c++ - 为什么 EXTERN_C 宏在其 C 形式中遗漏了 `extern`?

转载 作者:太空宇宙 更新时间:2023-11-04 01:19:51 24 4
gpt4 key购买 nike

在一个文件中,我有这个宏:

#if defined(__cplusplus)
#define EXTERN_C extern "C"
#else
#define EXTERN_C extern
#endif

但是在网络上搜索,此类宏在 C 路径 ( though some examples exist ) 上具有 extern 似乎并不典型。他们 generally come in pairs更类似于 EXTERN_C_BEGINEXTERN_C_END 来包装一组声明...并且在 C 构建中是空操作。

但这意味着在头文件中,您最终不得不编写:

EXTERN_C_BEGIN
extern int x; /* ...but I already said extern... */
void doSomething(int y);
EXTERN_C_END

这是因为 extern "C"int x; 等同于 extern "C"{ extern int x; }...不是extern "C"{ int x; }。后一种形式只给出了“C linkage”,而没有给出C extern的历史意义。那么如果你试图让 C 中的单行形式衰减到 extern,你不能说 EXTERN_C extern int x;,编译器会在 C++ build at the two-externs-on 处报错-一个声明。

由于没有开始/结束形式,这(通常)意味着更多的输入。但我更喜欢编译器的“意向声明”,即使是在 C 的情况下也是如此:

EXTERN_C int x;
EXTERN_C void doSomething(int y); /* does `extern` help the C case? */

我似乎不能随便创造一个好的场景,在函数声明中使用 extern 有助于发现 C 中的错误。但直觉上,冗余似乎是有值(value)的,正如我所说,必须做 extern "C" 之后还是把 extern 放在东西上感觉很别扭。

选择(或避免)这两种方法的原因是什么?

最佳答案

通常您会在为 C 编写并后来与 C++ 兼容的 header 中看到这一点。最简单的方法是简单地将整个 header 包装在 extern "C"{} 中。这样就不需要触及每一个声明,主要内容可以保持纯 C。

您所说的宏简化了这种包装。现在只有两行:

EXTERN_C_BEGIN
EXTERN_C_END

您不必执行稍微复杂一些的 Action 来对 C 编译器隐藏这些行:

#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif

另一个问题是全局变量相对较少(与函数相比),并且您不需要在函数声明中使用 extern。因此不再需要 extern 宏。

关于c++ - 为什么 EXTERN_C 宏在其 C 形式中遗漏了 `extern`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47027062/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com