gpt4 book ai didi

c++ - 具有多个定义时 extern 关键字没有错误

转载 作者:太空宇宙 更新时间:2023-11-04 01:06:22 25 4
gpt4 key购买 nike

我有以下代码段 main.c,下面是文件 somefile.h

#include "somefile.h"
extern int var = 10000;

int main()
{

cout << var << endl;
return 0;
}

和 somefile.h 包含

int var;

我的问题是,当我执行这段代码时,它会产生输出 10000,但为什么这不是重定义错误。因为我假设 extern int var = 10000; 是定义。现在,如果我在 somefile.h 中为 var 分配了一些值,它会给我一个错误,提示重新定义是预期的。我正在使用 VS 2010。

最佳答案

这个问题被标记为 C 和 C++,但它们是不同的语言。我的答案是关于 C。

如果您的代码在文件范围内包含序列 int var;/* ... */int var = 10000; 那么这在 C 中是合法的。

int var; 行称为暂定定义,它有点像函数的前向声明,但它是针对变量的。如果变量有后续定义,则该定义将取代它;否则暂定定义计数并且变量将被初始化为 0

您的 extern 关键字没有任何区别,因为在文件范围内定义的变量无论如何都是 extern 除非您专门使用 static 关键字。

但是,如果您添加了第二个翻译单元includes somefile.h,则行为未定义。这是因为两个不同的翻译单元都定义了变量var。您的链接器可能会对此进行诊断,但 C 标准并不要求它这样做。

如果您为 somefile.h 中的行提供初始值设定项,例如int var = 5000; 那么这是编译器必须诊断的多重定义错误。

关于c++ - 具有多个定义时 extern 关键字没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22398697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com