2014-09-23 91 views
0

例如:做一個c結構有其範圍內的範圍?

struct foo 
{ 
/* Scope? */ 
int a; 
int b; 

}; 

有沒有在這個結構的身體有什麼範圍? 是否知道存在?

+0

我相信它的確如此。 'struct.member'和'member'是不同的變量。 – 2014-09-23 03:29:42

+1

結構體內是否有聲明?如果不是,甚至不允許聲明的範圍意味着什麼? – 2014-09-23 03:30:41

+1

如果你在C而不是C++,那麼沒有範圍,因爲C結構沒有方法。 – 2014-09-23 03:34:22

回答

3

編號如6.2.1/2所述,C語言只有文件範圍,功能範圍,塊範圍和原型範圍。 C中沒有其他範圍。

結構類型不會創建範圍。例如,在{}之間聲明的任何新類型都將屬於封閉範圍。例如。如果聲明此文件範圍

struct foo 
{ 
    struct bar 
    { 
    int x; 
    } b; 
} a; 

那麼「嵌套」 struct bar類型定義將屬於文件範圍爲好。即您可以立即使用

struct bar b; 

在文件範圍內。 struct bar將引用上面的「嵌套的」struct bar類型定義(這意味着它基本上不是「嵌套」的)。

還要注意,C語言具有名稱空間的概念,在其中放置不同種類的標識符並在其中查找它們。每個結構類型都有其自己的名稱空間,其中放置了結構成員的名稱。然而,名稱空間的概念與範圍的概念不同,儘管它們協同工作。

目前尚不清楚你的意思是「b知道a存在」。 C語言不提供任何方法來編寫代碼,這取決於b「知道」什麼以及它「不知道」什麼。這使你的問題沒有意義。

+0

是真的,請問elaborate.struct.member與會員? – Unee0x 2014-09-23 03:34:59

+0

@ Unee0x:C語言規範說結構成員存在於與該結構類型關聯的單獨*名稱空間*中。但這是一個不同的概念。命名空間不是範圍。 – AnT 2014-09-23 03:55:02

+0

@ Unee0x如果您想回複用戶,請在名稱前加上「@」,並將您的回覆放在正確的位置......真正在您的問題下評論,而不是根據Andrey的回答。無論如何,真的評論與你的問題無關。 – 2014-09-23 04:47:08

-3

您的意思是,「我可以在struct foo的聲明中引用struct foo」嗎?

例子:

struct foo 
{ 
    ... 
    struct foo next; 
    ... 
} 

如果上面是你想要的,那麼,它是有效的。

+0

這是無效的,它試圖創建一個無限大小的結構體。 'struct foo * next;'是有效的。 – 2014-09-23 04:16:17

+1

除了無效之外,不,這不是OP的意思。請不要在答案中提出問題,將它們作爲評論發佈......一旦有足夠的代表這樣做。 – 2014-09-23 04:48:43