做不同的文件具有不同的范围
Do different files have different scopes?
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;
}
不允许对同一全局变量的多个定义。您必须标记变量static
,const
,或将它们放在匿名名称空间中。否则它们处于全球范围。
和您的第二个问题:示例代码没有编译,因为编译器没有从另一个文件中看到全局变量,因为编译器一次一次编译一个翻译单元(C 文件)。这就是为什么您需要添加extern i;
的原因。这告诉编译器,该变量将在另一个翻译单元中定义。
成功编译了所有文件后,它们将被链接。链接器检查所有翻译单元。当您遇到有关多个定义的错误时,此错误会在链接期间发生。
在同一可执行文件中链接的文件的全局范围是相同的。为了避免您可以将其声明为static
,但在C 中进行了弃用。
分离两个文件范围的正确方法是使用名称空间。
您的变量处于同一范围。您必须使用名称空间才能声明具有相同名称的变量。
相关文章:
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 包含来自另一个文件的函数会导致范围错误(openFoam)
- 是否将命名空间范围文件本地 (.cpp) 常量放在匿名命名空间中
- 有没有办法使用 mongocxx 驱动程序从 GridFS 集合的文件下载任意范围?
- 解析模板和范围后获取编译文件?
- 包含文件中的 Typdef "未在此范围内声明"
- 如何使用 AWS C++ 开发工具包在给定的开始和结束日期范围内列出 S3 中的文件
- 如何按升序对输入文件中的数字进行排序,并找到它们的范围和中值
- 代码作为 C 文件工作,但不作为C++文件,错误:'__builtin_types_compatible_p'未在此范围内声明
- 从文件中读取选定的行范围并存储到数组中
- 无法从另一个函数访问文件范围变量的内容
- C++ 从指定范围内的文件中读取数组
- 如何从范围 v3 的istream_range中检索文件大小?
- 将文件读取到向量的向量,超出范围错误
- 是否有一种方法可以避免标头文件中使用的constexpr函数输入全局范围,而无需额外的名称空间
- 为什么在.h中定义的私有结构需要.cpp文件中的返回类型中的范围
- 如何在标题文件中获取成员功能的正确代码覆盖范围
- 尽管包含正确的文件,但在此范围内未声明
- CPP文件中为什么需要范围解析运算符