3

这段代码正确吗?

extern "C" extern int x;       // 1
extern extern "C" int y;       // 2
extern "C" extern "C" int z;   // 3

int main() { }

gcc 拒绝 1 和 2 作为语法错误并接受 3。clang 接受所有这三个但对它们都给出重复声明说明符警告。

也许相关的是 C++17 [dcl.stc]/5:

说明extern符只能应用于变量和函数的名称。说明extern符不能用于类成员或函数参数的声明。对于使用extern说明符声明的名称的链接,请参见 6.5。[注意:extern关键字也可以用在显式实例化链接规范中,但在这种情况下它不是存储类说明符。——尾注]

4

1 回答 1

6

extern extern "C"不是有效的语法,因为extern "C"它不是说明符,因此不能出现在decl-specifier-seq中。相反extern "C",它只能作为链接规范的一部分出现,其语法为

extern string-literal { declaration-seq (opt) }
extern string-literal 声明

因此,extern "C"必须先发生。

此外,extern "C" extern根据 [dcl.link]/7,这也是无效的:

直接包含在链接规范中的声明被视为包含说明extern符(10.1.1),以便确定声明名称的链接以及它是否是定义。这样的声明不应指定存储类别。

extern是存储类说明符。)

不过,似乎没有任何规则禁止extern "C" extern "C"

于 2019-08-16T02:00:36.820 回答