2010-04-07 62 views
11

在C代碼中使用typedef代替#define有什麼好處(如果有的話)?爲什麼使用C typedefs而不是#defines?

作爲一例,是否有任何優勢,使用

typedef unsigned char UBYTE 

#define UBYTE unsigned char 

當兩個可以用作

void func() 
{ 
     UBYTE byte_value = 0; 

     /* Do some stuff */ 

     return byte_value; 
} 

顯然預處理器將嘗試無論看到哪一個,都會展開一個#define,這不會發生在typedef,但這在我看來並沒有什麼特別的優勢或劣勢;我無法想象如果出現問題,任何一種使用都不會導致構建錯誤。

回答

23

如果你做一個數組類型的類型定義,你會看到其中的差別:

typedef unsigned char UCARY[3]; 
struct example { UCARY x, y, z; }; 

這麼做其實就是用#define ......不,我們不要去那裏。

[編輯]:另一個優點是調試器通常知道typedefs而不是#defines。

+9

對預處理器的說法:「虐待我,虐待我..讓我覺得我想要!!」 +1 – 2010-04-07 11:01:58

+0

我確實會對預處理器的濫用做一些處理,但除非沒有其他辦法,否則不適用於類型。 (在過去的20年中,我需要它*編寫代碼來完成跨平臺的64位整數處理。這對當時的編譯器來說是非常棘手的問題,並且結束了比我更多的#ifdefs ) – 2010-04-07 13:33:47

+0

函數指針類型... – hugomg 2011-02-09 23:16:31

2

With #define在預處理過程中,您只能看到字符串替換。 typedef引入了一種新的類型。這樣可以更容易地找到代碼中可能存在的問題,以及編譯器能否提供更詳細的信息。

+1

不是一個* new *類型 - 它是現有類型的別名 - 但是它是一個類型,是 – philsquared 2010-04-07 11:03:41

3

嗯,從C++的未來,透視,使用代碼中的C++程序員可能會碰到這樣的:

 
template<typename T> class String 
{ 
    typedef T char_type; 
    // ... 
}; 

現在,如果你的C代碼,你寫的是這樣的:

 
#define char_type uint32_t // because I'm using UTF-32 

那麼,你會爲頭文件的用戶造成嚴重的麻煩。使用typedefs,您可以在不同範圍內更改typedef的值...而範圍不受#defines的限制。

我知道你已經標記了這個C,但是C程序員和C++程序員需要認識到他們的頭文件可能會被對方使用......這是要牢記的事情之一。

2

1)可能最大的好處是代碼更簡潔。 通常濫用宏會將代碼轉換成不可維護的混亂,即「宏湯」。

2)通過使用typedef定義一個新類型。使用宏你實際上替代文本。編譯器在處理typedef錯誤時肯定會更有幫助。

2
  • 如果編譯器/調試器知道類型,調試器和編譯器錯誤消息就會變得更有幫助。 (這也是爲什麼你應該使用常量而不是在可能的情況下定義的原因)
  • 數組,如其他人所示
  • 您可以將typedefs限制爲一個較小的作用域(比如函數)。在C++中更是如此。
相關問題