我在一个正在处理的大型项目中收到了链接器的双重定义错误。我很惊讶地发现我被允许意外地将初始化程序与extern
一起包含在内。
以下编译,但我没想到。
extern int var{3}; // declaration or definition?
//int var{3};
int main()
{
int varb = var;
return 0;
}
我希望extern
指定一个变量只是被声明,而不是被定义,但是如果我添加一个初始化器,它是否会被定义,为什么?
我查看了以下问题,但他们没有向我解释为什么允许这样做。
第二个答案确实澄清了以下内容:
声明是一个定义,除非它包含extern关键字 没有初始化器或函数体
因此规范确实表明这应该是一个定义,但为什么呢?这是否意味着以下两行意味着完全相同的事情?
extern int var{3};
int var{3};