是否允许extern extern“ C”和extern“ C” extern?

M.M*_*M.M 3 c++ extern language-lawyer extern-c

此代码正确吗?

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

int main() { }
Run Code Online (Sandbox Code Playgroud)

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

可能相关的是C ++ 17 [dcl.stc] / 5:

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

Bri*_*ian 6

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

extern 字符串文字 { 声明-seq(opt)}
extern 字符串文字 声明

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

同样,extern "C" extern根据[dcl.link] / 7 ,它也无效:

直接确定包含在链接规范中的声明,就好像它包含了extern说明符(10.1.1)一样,目的是确定声明的名称的链接及其是否为定义。此类声明不应指定存储类别。

extern是存储类说明符。)

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