2010-07-23 32 views
2

任何人都可以解釋的typedef,#定義

#define int* char 

的區別
typedef int* char; 
+4

可能你的意思是'#define char int *' – Curd 2010-07-23 08:31:06

+3

已經有許多重複的東西,例如[是typedef和#define在c中是一樣的嗎?](http://stackoverflow.com/questions/1666353/is-typedef-and-define-the-same-in-c) - 可能是一個作業問題? – 2010-07-23 08:40:38

+2

也檢查這一個 - http://stackoverflow.com/questions/3263252/is-typedef-just-a-string-replacement-in-code-or-somethings-else – KedarX 2010-07-23 08:52:16

回答

2

它們是不同的。檢查這個SO question

#define是更換在預處理

的typedef用於定義一個新的類型,是預處理

2

定義是由預處理器(實際的C編譯器前的程序運行),它的工作原理是取代所有的處理你編輯。

Typedef由c編譯器本身處理,並且是新類型的實際定義。

0

[typdef]允許您引入可能已經用其他方式聲明的類型的同義詞。如本例所示,新名稱與您想要的類型相同。

definec preprocessor macro,它只會取代您的代碼中的出現。

但是,您展示的特定示例對我來說似乎有點不可思議。也許你可以在你的問題中添加一些背景信息。

1

#define是一個預處理指令。在編譯之前,文本int*將更改爲char。這是你通常不會做的事情。

Typedef是一種語言指令。它定義了一個新類型,如剛纔所說的Forlan07

你的例子在任何一種形式中都很糟糕。幸運的是,這是非法的,因爲GMan指出。

5

有沒有區別,因爲兩者都是非法的過程中忽略了過程中進行處理。

int*不是一個宏的有效標識符,即使您放入一個空格,也不是int,因爲它是關鍵字並且是保留的。即使您將其切換到您可能預期的#define char int*,也會出於同樣原因失敗。

而且你不能重新定義類型char,所以typedef是胸圍。


的區別,你已經考慮到了法律的例子,是#define是一個預處理指令。它只是在編譯階段之前進行文本替換。相反,typedef定義了一個新類型,並且該新類型標識符像其他類型一樣遵守「規則」。

0

typedef將替代名稱分配給現有類型。即g: typedef unsigned long size_t

現在在代碼中,你可以用unsigned long long替換size_t unsigned long temp;與size_t temp相同;

'#define'是一個預處理指令。它使得編譯器遍歷源代碼,用替換字符串 (例如)替換每個出現的宏名稱。 #define PI 3.14159

您選擇的示例會導致編譯錯誤。

0

使用宏而不是typedef定義的類型別名具有未定義或重新定義的靈活性,而typedef不具有這種靈活性。這就是爲什麼你可能會看到以這種方式定義的類型別名。這既是一種弱點,也是一種優勢。使用常見名稱(例如UINT,DWORD或BOOL)定義其自己類型的C庫數量無數,並且在使用多個第三方庫時會引發許多問題。至少使用宏可以強制它們未定義,或檢查現有的定義;如果使用了typedef,那麼您可能會遇到符號衝突問題,從而難以集成此類代碼。

在C++中,通過將第三方代碼封裝在名稱空間中可以更好地解決問題,然後typedef仍然是輸入別名的更好解決方案。