簡體   English   中英

C ++中的名稱空間有效性

[英]namespace validity in c++

我對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命名空間中聲明的,並且在聲明了代碼塊后,在main中使用名稱空間的first和second將無效(因此,命名空間將再次被std)。 因此,上面的代碼應該可以工作。 我哪里錯了?

但在我看來,第一個x是在std命名空間中聲明的

你的想法錯了。 using namespace std使std中的名稱在全局名稱空間中可用,並不意味着在全局名稱空間中聲明的名稱在std

x在全局名稱空間中聲明。

所以命名空間將再次被std

不,文件中沒有任何內容位於名稱空間std ,只有<iostream>的內容位於名稱空間std

錯誤是,當您嘗試使用x ,您可能要引用的作用域中有兩個不同的變量::xfirst::x ,所以它是模棱兩可的。 您可以使用using聲明而不是using指令來消除歧義:

 {
    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名稱空間中。 如果這樣定義,它將僅位於std命名空間中:

namespace std
{
    int x;
}

因為它不在該命名空間中,所以在程序中稍后會與對x的引用匹配,並且當另一個聲明x的命名空間也正在使用時,此類引用就變得模棱兩可(例如在第一/第二個命名空間中使用)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM