如果一个项目中有两个声明了相同变量的 .cpp 文件,为什么链接器在只有一个是静态的情况下不显示错误?

If there are two .cpp files in one project with the same variable declared, why linker shows no error if only one is static?

提问人:Szymon Nowaczyk - Słomian 提问时间:10/13/2023 最后编辑:Remy LebeauSzymon Nowaczyk - Słomian 更新时间:10/13/2023 访问量:46

问:

假设我们有两个文件:和 ,它们都在一个项目中。在 中 我们创建全局变量,在 中创建 ..cppmain.cppanother.cppmain.cppstatic int foo = 10another.cppint foo = 20

现在,如果它们都不是,链接器将通知我们一个错误,指示声明了一个变量的多个实例。但在前面提到的例子中,Clion 实际上编译没有错误。static

在我的理解中,这两个变量在 中都是可见的,即使只有非变量在 中可见。为什么链接器不要求它们都成为?main.cppstaticanother.cppstatic

C++ 语法 静态 链接器 错误

评论

0赞 PaulMcKenzie 10/13/2023
您似乎不熟悉在文件范围内声明变量时会发生什么。该变量仅对该文件已知。在另一个模块中声明的 Static 与文件中声明的 static 不同,即使名称相同。staticfoofoo
1赞 user4581301 10/13/2023
战术说明:CLion 是一个位于编译器之上的工具。它不进行任何编译,因此与此问题无关。
0赞 user4581301 10/13/2023
这个问题是“构建如何知道 main.cpp 应该使用本地定义的而不是另一个 .cpp 中的?staticfoofoo
1赞 Remy Lebeau 10/13/2023
@user4581301在这种情况下,问题就变成了,“你认为为什么一开始就知道非静态的?除非非静态是 'ed in ,否则编译器或链接器根本没有理由关心它。main.cppfooanother.cppfooexternmain.cppmain.cpp
0赞 Ben Voigt 10/13/2023
“在我的理解中,这两个变量在 main.cpp 中都是可见的” 这可能是您的(错误)理解和编译器分歧的地方。

答: 暂无答案