2017-10-07 101 views
1
#include <iostream> 
using namespace std; 
namespace extra 
{ int i; }//Declared an integer i here 
    void i() 
    { 
     using namespace extra; 
     int i; //We called namespace extra at above then we declared another i 
     i=9; 
     cout<<i; 
    } 
    int main() 
    { 

     enum letter{i,j}; 
     class i{letter j;}; 
     ::i(); 

     return 0; 
    } 

正如我在上面的註釋中所解釋的,我們首先在名稱空間聲明一個整數i,然後在調用它之後我們聲明另一個整數然後給它一個值9.我的問題是爲什麼這不會導致重新指定錯誤?也在代碼行C++爲什麼這不會導致重新篩選錯誤?

i=9; 

我的價值獲得值9?命名空間中的一個還是void i()函數中的一個?

注意:請原諒我可憐的英語。

+1

'使用命名空間額外;'不會從命名空間中帶入所有內容,它的意思是「當查找一個名稱**也**看看該命名空間」。但是因爲你有一個地方的'我'的聲明,所以沒有必要再看。 –

+0

這實際上是一個很好的問題,但並不意味着它可以得到合理的答案。 C++確實有一些奇怪的規則來標識相同的名稱和陰影。但它恰好是這樣設計的。至少它不像JavaScript那樣瘋狂。 – VTT

回答

1

這是本地的。作爲一個經驗法則,它總是使用「最接近」的定義。

struct A {}; 
int A = 0; 
A b; // not ok, because A is the variable. 

沒有錯誤,因爲沒有名字i是指在全球範圍內的變量,或功能。

使用指令只是告訴編譯器,如果在當前上下文中找不到合適的名稱,它也應該在該名稱空間中查找。在你的情況下,編譯器不需要進入extra來查找i,因爲它已經在函數i中找到了一個。

相關問題