c++ - 与mind中的变量decleare和命名空间中的声明不冲突

标签 c++ namespaces

我正在研究 C++ 命名空间,我编写了一个简单的代码来理解它。特别是我编写了这段代码,但我不明白为什么它没有给我编译器错误,即我已经声明了变量“a”。编译器是否以某种方式帮助我?

#include<iostream>
using namespace std;
namespace funzioni_e_altro
{
    int a=5;
    int b=20;
    int c=10;
}
int main()
{
    using namespace funzioni_e_altro;
    int a=0;
    cout<<funzioni_e_altro::a<<"\n";
    cout<<b<<"\n";
    cout<<a<<"\n";
 return 0;
}

我希望它给我一个编译器错误,但它给了我输出:
5
20
0

最佳答案

using 指令使命名空间中的名称可用于非限定名称查找。但它不会在 block 中引入任何新的声明。当您在 main 中声明 a 时,它会隐藏 using 指令可能引入的名称。该 a 不是在 main 内进行非限定名称查找时不再考虑。

所以当你在main中写a时,它只能引用局部变量。就好像 main 中根本不存在 using 指令一样。

此行为是有意为之。它可以防止完全困惑的发生。如果需要,using 指令不应阻止代码在其自己的作用域中声明名称。并且您始终可以通过完全限定其名称来引用命名空间中的变量。

关于c++ - 与mind中的变量decleare和命名空间中的声明不冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56092705/

相关文章:

xml - 如何在保留现有命名空间的同时写入 XML 文件

Java类命名空间?

javascript - 使用多个文件时如何将函数保留在全局命名空间之外?

c++ - 将二维 boolean 值传递给函数

c++ -\t 考虑了多少个空格

c++ - 错误 : comparison between signed and unsigned integer expressions?

c++ - 如何有效地计算顶部排列

c++ - XCode 中的未知类型名称 'using'

c# - 如何通过 WCF 传递 System.Drawing.Rectangle?

c++ - 如何比较两个双向迭代器的(顺序)?