2013-06-29 51 views
6

一般來說,用#define還是constant char */ int定義一些特定的參數(例如(char *) UserIPaddr="192.168.0.5",(int) MAX_BUF=1024何時使用#define或常量char/int?

我看了一些線索說最好不要在#define的時候使用。但是,我看到開源代碼one example#define相當普遍的使用從源代碼:

#define IEEE80211_WLAN_HDR_LEN  24 
    a_uint8_t *iv = NULL; 
    a_uint16_t tmp; 
    a_uint16_t offset = IEEE80211_WLAN_HDR_LEN; 

#define可避免使用有,但我不知道爲什麼它是首選,以在該情況下,例如使用的#define 。我應該如何決定何時使用#define

回答

7

在C const聲明不產生常量表達式,因此,如果您需要具有使用const,傳統和更常用的方式做這樣一個常量表達式它不可能使用# define

例如const int不能用於:

  • 的情況下的標籤或
  • 作爲位字段寬度或
  • 如在非VLA數組聲明陣列大小(預C99天)
+0

'enum'? – Potatoswatter

2

我的經驗法則是不使用#define,除非符號必須是編譯時常量。考慮到這一點,我個人不會在你的例子中使用#define

採取不同的實施例從the same source file

#define CRYPTO_KEY_TYPE_AES   2 
... 
    switch (keytype) { 
    case CRYPTO_KEY_TYPE_AES: 

這裏,CRYPTO_KEY_TYPE_AES必須是一個常量表達式,因此使用恆定變量不會做。

3

使用#define的原因很少。它幾乎沒有完成static constenum不能。

作爲Alok保存提到,static const int不能在C中產生一個整型常量表達式(我沒有雙重檢查C標準;但在C++中並不是這樣)。但enum可以做到這一點。但純C中的enum不會增長以適應大於INT_MAX的值。因此,如果您需要long值作爲數組綁定或案例標籤使用,#define是您的朋友。或者考慮切換到使用C++的C子集,它沒有這樣的限制。

+0

對於開關,最好使用枚舉,所以編譯器會警告你,如果某些情況沒有被處理。 – LtWorf