代码之家  ›  专栏  ›  技术社区  ›  Ryujin

我对C++中的名称空间有点困惑[重复]

c++
  •  2
  • Ryujin  · 技术社区  · 1 周前
    #include <iostream>
    
    namespace first{
        int x = 1;
    }
    
    namespace second{
        int x = 2;
    }
    
    int main(){
    
        int x = 0;
        std::cout << x << std::endl;
    
        std::cout << first::x << std::endl; 
        
        using namespace second;
        std::cout << x << std::endl; 
    
        return 0;
    } 
    

    这是我使用的代码。在这段代码中,我期望0 1 2作为输出,但为什么我得到0 1 0作为输出?

    1 回复  |  直到 1 周前
        1
  •  4
  •   Christian Stieber    1 周前

    因为 using namespace x 只制造 x 用于所谓“非限定查找”的命名空间。然而,它不会使这样的查找覆盖本地名称(所谓的“块范围”)。

    不幸的是,我还没有找到一个简单的“首先搜索的内容”列表——但是,块范围或函数参数总是隐藏在更“全局”的名称后面。

    把它想象成“从内到外”。从使用变量名的位置开始,然后向上移动各个范围,直到找到变量。当你谈到全局变量之类的东西时,它会变得有点模糊,但在你的例子中,很明显 x 无论如何都会立即命中函数的局部变量。

    顺便说一句,我想具体说明一下 -Wshadow (g++):当变量名隐藏(“覆盖”)一个更全局的变量名时,它会使编译器发出警告。虽然有时这可能会很烦人,比如在嵌套保持相同捕获的lambda函数时,我仍然发现避免阴影是很有用的,这样读者就不必想知道使用了什么“版本”的变量。

    出于同样的原因,我很少使用 using namespace ,通常选择非常具体:我只会键入 second::x first::x 无处不在,所以毫无疑问 x 正在那个地方使用。