爲什麼typedef不能用於靜態?例如,下面的代碼是錯誤爲什麼typedef不能用於靜態?
typedef static int INT2;
使用typedef應遵循哪些其他規則?還有哪些關鍵字不能用於typedef?
非常感謝!
爲什麼typedef不能用於靜態?例如,下面的代碼是錯誤爲什麼typedef不能用於靜態?
typedef static int INT2;
使用typedef應遵循哪些其他規則?還有哪些關鍵字不能用於typedef?
非常感謝!
的typedef不聲明實例變量的,它聲明一個類(實際上是類型別名),
static
是你申請一個實例,而不是一個類型限定符,這樣你就可以使用靜態當你使用的類型,但不是當你定義類型時。這樣的..
typedef int int32;
static int32 foo;
static
關鍵字不是類型的一部分,取決於上下文,它是存儲或範圍說明符,對類型沒有影響。因此,它不能用作類型定義的一部分,這就是爲什麼它在這裏是無效的。
typedef是一個類型定義,即你所說的'這個名字'現在指的是'這個類型',你給的名字必須是一個由語言標準定義的標識符,類型必須是一個類型說明符,即已經命名的類型,可以是基類型或typedef'd,結構體,聯合體,類或枚舉說明符,可能有類型限定符,即const或volatile。
然而,靜態關鍵字不會改變類型,它說對象的東西,(一般來說,不是OOP意義上的)。它是放置在靜態存儲中的變量,而不是類型。
它看起來像你想使用typedef宏,即
#define MYINT static int
爲什麼這麼重要? –
@道格拉斯亞當斯迷:我認爲它確實;也許並不像貝利的回答那麼清楚。存儲說明符和範圍說明符不是*類型*的一部分;它們是類型實例如何存儲或作用域的一部分。 –
@Robert好吧,正如關鍵字所說,它是一種類型定義,因爲靜態不是類型的一部分,如果不能在類型的定義中使用。 – wich
存放時間與對象相關聯。 typedef聲明創建一個別名 - 一個類型的新名稱。它不創建對象。因此你不能在typedef中使用存儲說明符。
我覺得從至極和貝利的答案是正確的,足夠的,而是要幫助澄清那些評論說:當你聲明一個typedef生成的類型必須一致處處可以使用。如果你創建的類型定義出現在下面的代碼:
INT2 myfunction()
{
return 0;
}
class MyClass
{
public: INT2 x;
};
INT2 MyClass::x;
這同樣適用於Bailey提到的其他關鍵字。想想看:唯一可以爲其所有用途聲明一個類型的關鍵字是基本類型本身,以及類型修飾符(常量,無符號等)。
和其他人一樣,static
是存儲類說明符,而不是類型。具體而言,這意味着static
關鍵字告訴編譯器應該放置變量的位置,它是否應該作爲外部鏈接的符號出現,或變量應該保留多久。
類型是存儲位置的解釋。它描述了哪些數據位於該位置,並與可以在該數據上執行的一組操作相關聯。
所以類型和存儲類只是相關的,因爲他們都說一些數據。 typedef
關鍵字用於爲類型創建新名稱。
至於隨機比喻...
A型是像在談論一個特定的品牌和型號的汽車。
一個存儲類就像是說一輛汽車存放在私人加熱車庫裏,只用在私人賽車場上。
typedef是特定品牌和型號的暱稱。
typedef
不能與static
一起使用,因爲typedef
和static
都是存儲類。如果將變量定義爲typedef static int a;
,那麼存在變量a
的多個存儲類別。
存儲類用於定義變量和/或函數的範圍(可見性)和生命週期。一些例子是static
,auto
,register
,extern
,typedef
等
雙方的typedef和靜態都在語言存儲類(對於C完全正確,我相信這也適用於C++)。在一個聲明中只能有一個存儲類 - 在您的示例中有兩個,因此是錯誤。 –
+1。 「typedef說明符被稱爲」存儲類說明符「,僅用於語法方便;」 – dirkgently