当我在两个不同的翻译单元的全局范围内添加两个同名的变量时,为什么我在 C++ 中没有收到链接器错误?[复制]

Why do I not get a linker error in C++ when I am adding two variables with same name in the global scope in two different translation units? [duplicate]

提问人:gbhardwaj00 提问时间:10/16/2023 最后编辑:273Kgbhardwaj00 更新时间:10/16/2023 访问量:56

问:

人员.cpp

#include <iostream>
// using namespace std;

int alpha = 5;

int main()
{
    std::cout << alpha << std::endl;
}

人员2.cpp

int alpha = 10; 

我用来编译的命令

g++ -o '.\Person.cpp' .\Person2.cpp

它运行良好并打印“5”,但我预计会出现某种链接器错误。

C++ 变量 链接 命名空间链接 器错误

评论

1赞 user12002570 10/16/2023
我们确实收到链接器错误。演示和第二个演示
1赞 Drew Dormann 10/16/2023
这是因为编译器不需要诊断此冲突,但未定义违反该冲突的程序的行为。允许链接器假定所有定义都相同。
1赞 user12002570 10/16/2023
Dupe:GCC:全局变量的多个定义不会给出链接器错误。另请参阅一个定义规则冲突,无需诊断
0赞 Cem Polat 10/16/2023
链接器不负责报告具有相同名称的多个全局变量的错误。根据 C++ 中的“一个定义”规则,“在某些情况下,一个类型或模板可以有多个定义。由多个头文件和源文件组成的程序通常具有多个类型的定义,但每个翻译单元不超过一个定义。因此,如果将这些变量放在同一个文件中,可能会出现错误。查看 en.wikipedia.org/wiki/One_Definition_Rule
1赞 Jerry Coffin 10/16/2023
@DrewDormann:纯粹从技术上讲,代码格式不正确,但不需要诊断(这在哲学上与UB不同,但仅此而已)。

答: 暂无答案