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

标签 c++ c linker-errors

我有以下代码段 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/

相关文章:

删除 char 数组时 C++ 堆损坏

iphone - 使用selector方法调用C Function并在iPhone的c方法中访问self

c++ - 将构造函数添加到我的结构时不断出现链接器错误

c++ - 无法链接 duma 库

C++ - LNK2019 错误未解析的外部符号 [模板类的构造函数和析构函数] 在函数 _main 中引用

C++ - 最快的检查数组边界

c++ - Qt 将不完整的 JPEG 数据加载到 QPixMap 如何验证?

c++ - 为什么我不能将具有不可复制类参数的 lambda 转换为 std::function?

c - 如何在给定绝对路径的 ext2 虚拟镜像 (.img) 中查找目录的 inode?

c - 使用递归的成对差异