learncpp-2 函数和文件

2 函数和文件

2.9 命名冲突和命名空间

  • 两个(或多个)同名函数(或全局变量)被引入到属于同一程序的不同文件中,这将导致链接器错误。
  • 两个(或多个)同名函数(或全局变量)被引入到同一个文件中。这将导致编译器错误。
  • 不同的作用域(例如命名空间)中可以有相同的标识符
  • 只有声明和定义可以出现在命名空间的作用域中,可执行代码不能出现在命名空间中(但是命名空间中可以包含函数的定义,而函数的定义中可以包含可执行的代码)
  • 全局命名空间
    • 任何没有在类、函数、命名空间中定义的名称都是隐式定义的命名空间的一部分,这个隐式定义的命名空间称为全局命名空间/全局作用域
    • 在全局作用域内声明的标识符从声明处到文件末尾都是有效的
    • 尽量避免在全局作用域中定义变量
    • #include语句引入的声明也在全局作用域中
  • std命名空间
    • C++将标准库中的所有功能都移到了一个名为std的命名空间中
  • 当标识符包含命名空间前缀时,该标识符称为限定名
  • 避免使用using指令(例如using namespace std;),这可能会导致我们自己定义的标识符和std命名空间里的标识符产生冲突(这就是为什么要将标准库中的所有标识符移到std命名空间中的原因!!!)
#include "iostream"
int cout = 3;
int main() {
    cout << "aaa"; // 编译报错:Invalid operands to binary expression ('int' and 'const char[4]') 因为cout是int
    std::cout << "aaa"; // 编译通过
    return 0;
}
#include "iostream"
using namespace std;
int cout = 3;
int main() {
    cout << "aaa"; // 编译报错:Reference to 'cout' is ambiguous:candidate found by name lookup is 'cout';candidate found by name lookup is 'std::cout'
                   // 因为编译器不知道这里的cout是全局命名空间里的cout(int)还是std命名空间里的cout(ostream)
    return 0;
}
posted @ 2024-07-22 22:18  dengkang1122  阅读(1)  评论(0编辑  收藏  举报