2012-11-04 5 views
25

Sto implementando la macro X, ma ho un problema con una semplice espansione di macro. Questa macro (vedi sotto) è utilizzata in diversi esempi di utilizzo di macro, includendo nell'articolo this. Il compilatore fornisce un messaggio di errore, ma è possibile visualizzare un codice C valido utilizzando il flag -E con il compilatore GCC.errore: incollare "." e "red" non fornisce un token di preelaborazione valido

La macro X-lista è definita come la seguente:

#define LIST \ 
    X(red, "red") \ 
    X(blue, "blue") \ 
    X(yellow, "yellow") 

E poi:

#define X(a, b) foo.##a = -1; 
    LIST; 
#undef X 

Ma il gcc dato i seguenti errori messaggi:

lixo.c:42:1: error: pasting "." and "red" does not give a valid preprocessing token 
lixo.c:42:1: error: pasting "." and "blue" does not give a valid preprocessing token 
lixo.c:42:1: error: pasting "." and "yellow" does not give a valid preprocessing token 

Come ho Detto, posso vedere un codice C valido utilizzando lo switch -E su gcc:

lixo.c:42:1: error: pasting "." and "red" does not give a valid preprocessing token 
lixo.c:42:1: error: pasting "." and "blue" does not give a valid preprocessing token 
lixo.c:42:1: error: pasting "." and "yellow" does not give a valid preprocessing token 
    foo.red = -1; foo.blue = -1; foo.yellow = -1;; 

Che cos'è un token di preelaborazione valido? Qualcuno può spiegarlo?

(prima di dire "perché non basta un aut inizializzare o memset()?" Non è il mio vero codice.)

risposta

36

. separa gettoni e quindi non è possibile utilizzare ## come .red non è un token valido. Dovresti usare solo ## se concateni due token in uno solo.

Questo funziona:

#define X(a, b) foo.a = -1; 

What's a valid proprocessing token? Can someone explain this?

Si tratta di ciò che viene analizzato/lexed. foo.bar sarebbe essere analizzato come 3 gettoni (due identificatori e un operatore): foo . bar Se si utilizza ## si otterrebbe solo 2 gettoni (un identificatore e un gettone valido): foo .bar

+0

Grazie molto. – Jack

+5

Quindi la sezione "Incollare i token" in [questo articolo] (http://www.cprogramming.com/tutorial/cpreprocessor.html) è semplicemente sbagliata? – Michael

+5

@ Michael Sì, è sbagliato. –