2010-04-07 26 views
11

Qual è il vantaggio (se esiste) di utilizzare typedef al posto di #define nel codice C?Perché utilizzare typedef anziché #defines?

Ad esempio, non v'è alcun vantaggio di utilizzare

typedef unsigned char UBYTE 

sopra

#define UBYTE unsigned char 

quando entrambi possono essere usati come

void func() 
{ 
     UBYTE byte_value = 0; 

     /* Do some stuff */ 

     return byte_value; 
} 

Ovviamente il pre-processore tenterà di espandi uno #define ovunque ne veda uno, cosa che non succederebbe con un typedef, ma ciò non mi sembra un particolare vantaggio o svantaggio; Non riesco a pensare a una situazione in cui entrambi gli usi non comporterebbero un errore di compilazione in caso di problemi.

risposta

23

Se fate un typedef di un tipo di matrice, si vedrà la differenza:

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

farlo con una #define ... no, non andiamo lì.

[EDIT]: Un altro vantaggio è che un debugger di solito sa di typedef ma non #defines.

+9

Qua il preprocessore: "Abuso di me, Abuso di me .. Fammi sentire voluto !!" +1 –

+0

L'abuso del preprocessore lo faccio un bel po ', ma non per i tipi a meno che non ci sia altro modo. (Ne avevo bisogno * una volta * negli ultimi 20 anni quando scrivevo il codice per eseguire la gestione dell'intero cross-platform a 64 bit. Era sorprendentemente difficile per i compilatori disponibili al momento, e ho finito con più #ifdefs di quanti ne avrei avuti preferito.) –

+0

Anche i tipi di puntatori di funzione ... – hugomg

2

Con #define tutto ciò che si ottiene è la sostituzione delle stringhe durante la preelaborazione. typedef introduce un nuovo tipo. In questo modo è più facile trovare possibili problemi nel codice e nel caso in cui il compilatore possa essere in grado di fornirti informazioni più dettagliate.

+1

non proprio un * nuovo * tipo - è un alias per un tipo esistente - ma un tipo è, sì – philsquared

3

Beh, proveniente da un C++, prospettiva, un programmatore C++ utilizzando il codice potrebbe avere qualcosa di simile:

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

Ora, qualcosa se nel codice C, che hai scritto come:

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

Bene, causerete seri problemi agli utenti del vostro file di intestazione. Con typedef, puoi cambiare il valore del typedef in ambiti diversi ... mentre gli ambiti non sono rispettati con #defines.

So che hai etichettato questa C, ma i programmatori C e i programmatori C++ devono rendersi conto che le loro intestazioni potrebbero essere utilizzate l'una dall'altra ... e questa è una di quelle cose da tenere a mente.

2

1) Probabilmente il grande vantaggio è un codice più pulito. In genere le macro che abusano trasformano il codice in un pasticcio non gestibile, noto come "macro zuppa".

2) Utilizzando un typedef si definisce un nuovo tipo. Usando una macro si sostituisce effettivamente il testo. Il compilatore è sicuramente più utile quando si affrontano errori typedef.

2
  • I debugger ei messaggi di errore del compilatore diventano più utili se il compilatore/debugger conosce il tipo. (questo è anche il motivo per cui dovresti usare le costanti e non definire dove possibile)
  • Array, come altri hanno mostrato
  • puoi limitare i typedef a un ambito più piccolo (ad esempio una funzione). Ancora più vero in C++.
Problemi correlati