C 的名称空间有效性

namespace validity in c++

本文关键字:空间 有效性      更新时间:2023-10-16

我在C 中有一个简单的问题。当我编译以下小代码时,存在错误。我不明白为什么。感谢提前的任何帮助!

#include <iostream>
using namespace std;
int x=100;
namespace first
{
     int x=1;
}
namespace second
{
     int x=2;
}
int main(){
     {
        using namespace first;
        cout<<x<<endl;
     }
     {
        using namespace second;
        cout<<x<<endl;
     }
     cout<<x<<endl;
}

如果我在全球范围和最后一个语句中评论X。它可以正常工作。但是在我看来,第一个X在STD名称空间中被声明,并且在声明的代码块之后,首先使用名称空间和第二个X将无效(因此名称空间将再次为STD)。因此上述代码应该起作用。我在哪里错了?

但是在我看来,第一个X在STD名称空间中声明

您的想法是错误的。using namespace std从全局名称空间中可用的std提供名称,并不意味着全局名称空间中声明的名称在std中。

x在全局名称空间中声明。

因此,命名空间将再次为std

no,您的文件中没有任何内容在命名空间std中,只有<iostream>的内容在命名空间std中。

错误是,当您尝试使用x时,您可以参考的范围,::xfirst::x中有两个不同的变量,因此这是模棱两可的。您可以使用使用声明而不是使用指令来消除歧义:

 {
    using first::x;
    cout<<x<<endl;
 }

这说明在该范围中x是指first::x

在这种情况下x变量是模棱两可的。编译器找不到您要使用的X。你可以这样写。

#include <iostream>
using namespace std;
int x=100;
namespace first
{
     int x=1;
}
namespace second
{
     int x=2;
}
int main(){
     {
        cout<<first::x<<endl;
     }
     {
        cout<<second::x<<endl;
     }
     cout<<x<<endl;
}

现在您的代码将编译。

第一个X不在STD名称空间中。如果这样定义,则只会在性病名称空间中:

namespace std
{
    int x;
}

由于它不在该名称空间中,因此稍后在程序中对X的引用匹配,并且当还使用其他名称空间x时,此类参考会变得模棱两可(如使用first/second使用名称空间)。

<)。 <</p>