2013-06-29 18 views
6

In generale, è meglio definire alcuni parametri specifici (ad esempio (char *) UserIPaddr="192.168.0.5", (int) MAX_BUF=1024) da #define o constant char */ int?Quando utilizzare #define o char costante/int?

Ho letto alcuni thread dire che è meglio non usare #define quando è possibile. Tuttavia, vedo uso abbastanza comune di #define sui codici open source one example da un codice sorgente:

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

#define potrebbero essere evitati da usare lì, ma mi chiedo perché si è preferito utilizzare # define in quel caso, per esempio . Come dovrei decidere quando usare #define o no?

risposta

7

In C const dichiarazioni non producono espressioni costanti, quindi se è necessario avere un'espressione costante non è possibile utilizzando const, il modo tradizionale e più comunemente usato per farlo è utilizzare # define.

Ad esempio const int non possono essere utilizzati in:

  • un'etichetta caso o
  • come larghezza di bit-field o
  • come dimensione dell'array in una dichiarazione di matrice non-VLA (giorni pre C99)
+0

Che dire di 'enum'? – Potatoswatter

2

La mia regola generale è quella di non utilizzare #define a meno che il simbolo non sia una costante in fase di compilazione. Con questo in mente, personalmente non avrei usato #define nell'esempio.

Per fare un esempio differente da the same source file:

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

Qui, CRYPTO_KEY_TYPE_AES deve essere un'espressione costante, e quindi utilizzando una variabile costante non farebbe.

3

Ci sono alcuni motivi per utilizzare #define. C'è poco da fare che un static const o enum non può.

Come indicato in Alok Save, static const int non può produrre un'espressione costante integrale in C (non sto verificando due volte lo standard C, ma non è il caso in C++). Ma enum può farlo. Tuttavia, enum in C pura non cresce per contenere valori superiori a INT_MAX. Quindi, se hai bisogno di un valore long da utilizzare come etichetta di serie o etichetta del caso, #define è tuo amico. Oppure considera di passare all'utilizzo del sottoinsieme C di C++, che non ha tali restrizioni.

+0

per lo switch, è preferibile utilizzare l'enumerazione, quindi il compilatore avverte se non viene gestito alcun caso. – LtWorf

Problemi correlati