2013-06-29 20 views
6

Ogólnie, czy lepiej jest zdefiniować pewne określone parametry (np. (char *) UserIPaddr="192.168.0.5", (int) MAX_BUF=1024) przez #define lub constant char */ int?Kiedy użyć #define lub stałej char/int?

Przeczytałem niektóre wątki, że lepiej nie używać #define, gdy jest to możliwe. Jednak widzę dość powszechne wykorzystanie #define na kodów open source one example z kodem źródłowym:

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

#define można by uniknąć, aby nie używać, ale zastanawiam się, dlaczego to było korzystne stosowanie #define w tym przypadku, na przykład . Jak powinienem zdecydować, kiedy używać #define, czy też nie?

Odpowiedz

7

W C const deklaracje nie dają stałych wyrażeń, więc jeśli potrzebujesz stałego wyrażenia, którego nie można użyć przy użyciu const, tradycyjnym i powszechnie stosowanym sposobem jest użycie # define.

Przykładowo const int nie mogą być stosowane w:

  • etykietę przypadek lub
  • jako szerokość bitów pola lub
  • jak rozmiar matrycy w nie-VLA zgłoszenia Array (pre C99 dni)
+0

Co z 'wyliczeniem'? – Potatoswatter

2

Moja zasada polega na tym, aby nie używać #define, chyba że symbol musi być stałą czasu kompilacji. Mając to na uwadze, osobiście nie użyłbym w twoim przykładzie #define.

By wziąć inny przykład z the same source file:

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

Tutaj CRYPTO_KEY_TYPE_AES musi być stałym wyrażeniem, a więc stosując zmienny stały nie zrobi.

3

Istnieje kilka powodów, aby używać #define. Niewiele robi, aby nie można go było uzyskać.

Jak wspomina Alok Save, static const int nie może wytworzyć stałego wyrażenia stałego w C (nie jestem podwójnym sprawdzaniem standardu C, nie jest tak w przypadku C++). Ale może to zrobić enum. Jednak enum w czystym C nie rośnie, aby pomieścić wartości większe niż INT_MAX. Jeśli więc potrzebujesz wartości long, aby użyć jej jako etykiety powiązanej z tablicą lub etykiety sprawy, Twoim przyjacielem jest #define. Lub rozważ przejście na używanie C z C++, który nie ma takich ograniczeń.

+0

dla przełącznika, lepiej używać wyliczeń, więc kompilator ostrzega, jeśli nie jest obsługiwany jakiś przypadek. – LtWorf