2017-08-17 80 views
1

我開始在結構上執行程序。我對於聲明結構本身感到困惑,因爲它允許多個同一個變量的聲明,這在c中不常見。爲什麼在相同結構變量的多個聲明中沒有錯誤

讓我們看看下面的代碼:

#include<stdio.h> 

struct { 
     int x; 
     int y; 
}u, v; 

int main() 
{ 
     struct {int x; int y;} u = {3, 4}, v = {5, 6}; 
/*  struct {int x; int y;} u, v*/ 
     printf("%d\n", u.x); 
     printf("%d\n", v.y); 

     return 0; 
} 

一般來說,C不允許同一個變量的多次聲明,在這裏也它,如果我沒有在主註釋掉第二條語句。但是我的疑問是,爲什麼它忽略了同一變量的多重聲明,如果其中一個是主要的而不是其他的?

+1

內部'u'與外部'u'不同。所有這兩者都有一個共同點,就是名稱,內部的'u'陰影(隱藏)外部的'u'。 'v'一樣。 – alk

+0

'char x; void foo(int x){{float x; {double x;}}}'是有效的。 :-) – alk

回答

3

某些範圍內的變量被允許爲shadow變量在封閉範圍內。因此,這兩個變量都存在,但如果在main內寫入u,則它指的是main中聲明的那個。

不要寫這樣的代碼,它很混亂,雖然合法。

+0

那麼,u和v寫在main之外是全局變量嗎? – hanugm

+1

C中的正確術語應該是*文件範圍*變量。這可能是你的意思*全球*。 –

2

如果在不同範圍內聲明瞭相同的變量,C允許多個聲明。具有區域範圍的main中聲明的u將隱藏全局聲明的u的聲明。

§6.2.1(P4):

[...]內的內範圍,標識符指定在內部範圍聲明的實體;在外部範圍中聲明的實體在內部範圍內隱藏(並且不可見)。

相關問題