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关键字也可以在显式实例和链接规范中使用,但是在这种情况下它不是存储类说明符。—尾注]
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"。
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |