2010-11-11 155 views
3

嗨全部 我只是想知道我們是否可以聲明變量名稱作爲結構名稱。結構類型和變量名稱

例如

typedef struct 
{ 
    char c; 
}t; 

然後在一些功能我可以用

fun() 
{ 
    t t; 
} 

是這有效嗎?如果是這樣,那麼編譯器如何區分它們?

+0

您可以隨時編譯它......我認爲編譯器將能夠區分,因爲您可以知道變量/對象何時被聲明與讀取/寫入/等等。 – 2010-11-11 04:30:15

+1

@muntoo,你可以編譯它,但是它不會告訴你它是否有效,只是它是否在你的編譯器中起作用。 – 2010-11-11 04:33:41

+0

當然,如果精神病患者是看着你的代碼的下一個人... ... – 2010-11-11 04:41:56

回答

3

是的,它是有效的。如果這樣做,那麼結構類型將隱藏在封閉範圍內,並且t僅引用聲明的變量。

0

是的,因爲每個事物在編譯器的理解中都處於不同的位置。

t t; 

編譯器在遇到第一個t時期待一個類型,並且它有一個類型叫做t。

編輯:爲了解決評論。

我不是在談論範圍。

但是由於我沒有編寫一個編譯器(只有解釋器),我不知道這個術語。編譯器期望第一個t的一個標記是一個類型,它也知道到那時爲止已經聲明瞭什麼類型。因爲它看到一個名稱,指的是一種類型,它很高興。而如果在那裏找到一個不是類型的令牌,那麼它會正確地發出錯誤信號。

+0

-1,因爲你的理由是錯誤的。 'typedef'和變量名在相同的範圍內。 – 2010-11-11 08:43:43

+0

術語是它們是不同類型的標記。 – Praxeolitic 2014-09-04 04:12:02

1

fun() { t t; }

是這有效嗎?

不,它不是。返回類型fun()缺失且隱含int返回類型已棄用。

但是void fun(){ t t ;}在語法上是有效的。

3

是的,但你爲什麼要?如果你想在你的項目中發現錯誤和錯誤,那麼就直接提出並在類型之後命名變量。

+2

布拉沃,只是因爲某些東西是有效的,這並不是一個好主意。 – paxdiablo 2010-11-11 04:54:04

0

解析器首先獲取數據類型,並維護一個不同的表和後面的部分作爲變量名。所以它絕對有效。