标准是否允许以下内容?
#include <iostream>
extern int a;
auto a = 3;
int main(int, char**)
{
std::cout << a << std::endl;
return 0;
}
答案 0 :(得分:2)
从标准中我不太清楚,但是,有这个写的
第7.1.6.4节自动说明符
在本节未明确允许的上下文中使用auto的程序是不正确的。
最好阅读所有允许的上下文标准的上述部分。
考虑到这一点,我相信g ++是正确的,并且铿锵有误。但我可能是错的,标准中可能有一些单独的部分可能暗示这种情况,但我找不到它。
答案 1 :(得分:-2)
编辑答案: 正如评论中提到的那样。这种情况下的问题是写作
external int a;
auto a = 3;
与写作相同
external int a;
int a = 3;
这意味着你有一个新的a定义并导致错误。
第一个回答:
根据我的理解,这会破坏One定义规则的一部分。具体来说,我的意思是以下规则(参考MISRA C ++ 2008),该规则表明具有外部链接的标识符应始终只有一个定义。在您的示例中,您在当前文件(auto a = 3;
)中有一个定义,而在外部您也可以引用另一个文件中的定义。