2010-02-07 46 views
18

爲什麼typedef不能用於靜態?例如,下面的代碼是錯誤爲什麼typedef不能用於靜態?

typedef static int INT2; 

使用typedef應遵循哪些其他規則?還有哪些關鍵字不能用於typedef?

非常感謝!

+8

雙方的typedef和靜態都在語言存儲類(對於C完全正確,我相信這也適用於C++)。在一個聲明中只能有一個存儲類 - 在您的示例中有兩個,因此是錯誤。 –

+3

+1。 「typedef說明符被稱爲」存儲類說明符「,僅用於語法方便;」 – dirkgently

回答

31

的typedef不聲明實例變量的,它聲明一個類(實際上是類型別名),

static是你申請一個實例,而不是一個類型限定符,這樣你就可以使用靜態當你使用的類型,但不是當你定義類型時。這樣的..

typedef int int32; 
static int32 foo; 
+3

'static'不是限定詞,而是*存儲類說明符*。因此,它不是像「const」這樣的限定符的「類型的一部分」,例如, 'typedef const int ci; ci x = 42;'(具有不同限定符的類型仍然是相同的類型,但可能不兼容)。 – dyp

+0

@John Knoeller 優雅! 一個很好的答案! – Sohaib

20

static關鍵字不是類型的一部分,取決於上下文,它是存儲或範圍說明符,對類型沒有影響。因此,它不能用作類型定義的一部分,這就是爲什麼它在這裏是無效的。

typedef是一個類型定義,即你所說的'這個名字'現在指的是'這個類型',你給的名字必須是一個由語言標準定義的標識符,類型必須是一個類型說明符,即已經命名的類型,可以是基類型或typedef'd,結構體,聯合體,類或枚舉說明符,可能有類型限定符,即const或volatile。

然而,靜態關鍵字不會改變類型,它說對象的東西,(一般來說,不是OOP意義上的)。它是放置在靜態存儲中的變量,而不是類型。

它看起來像你想使用typedef宏,即

#define MYINT static int 
+1

爲什麼這麼重要? –

+0

@道格拉斯亞當斯迷:我認爲它確實;也許並不像貝利的回答那麼清楚。存儲說明符和範圍說明符不是*類型*的一部分;它們是類型實例如何存儲或作用域的一部分。 –

+0

@Robert好吧,正如關鍵字所說,它是一種類型定義,因爲靜態不是類型的一部分,如果不能在類型的定義中使用。 – wich

7

存放時間與對象相關聯。 typedef聲明創建一個別名 - 一個類型的新名稱。它不創建對象。因此你不能在typedef中使用存儲說明符。

3

我覺得從至極和貝利的答案是正確的,足夠的,而是要幫助澄清那些評論說:當你聲明一個typedef生成的類型必須一致處處可以使用。如果你創建的類型定義出現在下面的代碼:

INT2 myfunction() 
{ 
    return 0; 
} 

class MyClass 
{ 
    public: INT2 x; 
}; 

INT2 MyClass::x; 
  • 函數返回INT2將毫無意義。當然,返回值不是靜態的(不能)。
  • MyClass中的x成員聲明將是靜態的,還有它的後續定義?這不僅是多餘的,而且是不正確的,因爲在定義靜態成員時不使用static關鍵字 - 僅在聲明時才使用。

這同樣適用於Bailey提到的其他關鍵字。想想看:唯一可以爲其所有用途聲明一個類型的關鍵字是基本類型本身,以及類型修飾符(常量,無符號等)。

3

和其他人一樣,static是存儲類說明符,而不是類型。具體而言,這意味着static關鍵字告訴編譯器應該放置變量的位置,它是否應該作爲外部鏈接的符號出現,或變量應該保留多久。

類型是存儲位置的解釋。它描述了哪些數據位於該位置,並與可以在該數據上執行的一組操作相關聯。

所以類型和存儲類只是相關的,因爲他們都說一些數據。 typedef關鍵字用於爲類型創建新名稱。

至於隨機比喻...

A型是像在談論一個特定的品牌和型號的汽車。

一個存儲類就像是說一輛汽車存放在私人加熱車庫裏,只用在私人賽車場上。

typedef是特定品牌和型號的暱稱。

2

typedef不能與static一起使用,因爲typedefstatic都是存儲類。如果將變量定義爲typedef static int a;,那麼存在變量a的多個存儲類別。

存儲類用於定義變量和/或函數的範圍(可見性)和生命週期。一些例子是staticautoregisterexterntypedef

+0

這很有趣!的確,'typedef'被指定爲*存儲類說明符*,儘管「僅用於語法方便」6.7.1/3。 – dyp

+0

Jonathan Leffler在[OP]的評論中說過同樣的內容(http://stackoverflow.com/questions/2218435/why-typedef-can-not-be-used-with-static#comment2172109_2218435)。 – dyp

相關問題