做不同的文件具有不同的范围

Do different files have different scopes?

本文关键字:范围 文件      更新时间:2023-10-16

in file1.cc i写

int i = 0;

在file2.cc中我写

#include <iostream>
int i = 1;
int main()
{
  std::cout<< i << std::endl;
  return 0;
}

在MacOS中,编译器报告

duplicate symbol _i in:
/var/folders/wn/q9648wb507j9l504vp2d_dwm0000gn/T/file1-bb8eca.o
/var/folders/wn/q9648wb507j9l504vp2d_dwm0000gn/T/file2-b5e667.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

但是不是不同的文件具有不同的范围,以便我们可以在文件2中使用与file1相同的名称定义一个全局变量?此外,如果不同的文件处于同一范围,那么为什么要转换file2.cc是:

是非法的
#include <iostream>
int main()
{
  std::cout<< i <<std::endl;
  return 0;
}

不允许对同一全局变量的多个定义。您必须标记变量staticconst,或将它们放在匿名名称空间中。否则它们处于全球范围。

和您的第二个问题:示例代码没有编译,因为编译器没有从另一个文件中看到全局变量,因为编译器一次一次编译一个翻译单元(C 文件)。这就是为什么您需要添加extern i;的原因。这告诉编译器,该变量将在另一个翻译单元中定义。

成功编译了所有文件后,它们将被链接。链接器检查所有翻译单元。当您遇到有关多个定义的错误时,此错误会在链接期间发生。

在同一可执行文件中链接的文件的全局范围是相同的。为了避免您可以将其声明为static,但在C 中进行了弃用。
分离两个文件范围的正确方法是使用名称空间。

您的变量处于同一范围。您必须使用名称空间才能声明具有相同名称的变量。

相关文章: