![]() |
1
12
编辑: 看起来C允许 tentative definitions 一个变数。 在您的例子中,两个全局定义都是暂定的,在这种情况下,链接器看到的第一个定义被选中。 将文件2更改为:
现在,如果像以前那样编译,file1中的暂定def将被忽略。 通过以下方式使两个def都显式:
现在两者都不能忽略,我们得到多重定义错误。 |
![]() |
2
5
这与c中的“暂定定义”有关。
来自C标准(强调我的):
对于您的案例,“翻译单元”(基本上)每个源文件。 关于“复合类型”:
有关暂定定义的详细信息,请参见 this question and its answers 。
对你的案子来说,这应该是一种未定义的行为,因为
GNU LD有一个称为
从 manual :
|
![]() |
3
1
链接器允许有这样的重复外部数据(尽管我很惊讶不同的类型不会造成问题)。哪一个取决于link命令行中对象文件的顺序。 |
![]() |
4
1
你在用哪个编译器。站台是什么?用g++我得到
AfAIR,在C++中,不同翻译单元中的变量具有完全相同的工作声明。 |
![]() |
glor · 如何在报价单中的r中使用全局变量 6 年前 |
![]() |
Mabadai · 将一个int数组复制到另一个C++ 6 年前 |
![]() |
infinite · 即使没有声明也在使用全局定义 6 年前 |
![]() |
Rakesh · 全局变量值不反映在函数之间 6 年前 |
![]() |
oneMoreDeveloper · Javascript全局数组声明 6 年前 |
![]() |
Klayd Pro · 在c中使用本地指针调用并返回函数 6 年前 |
![]() |
Rob Matthews · 为模拟信用卡应用程序颁发简单的唯一ID 6 年前 |