2012-11-04 18 views
25

Wdrażam makro X, ale mam problem z prostym rozszerzeniem makr. To makro (patrz poniżej) jest używane w kilku przykładach użycia makr, zamieszczając w artykule this. Kompilator wyświetla komunikat o błędzie, ale widzę prawidłowy kod C za pomocą flagi -E z kompilatorem GCC.błąd: wklejanie "." i "czerwony" nie daje prawidłowego tokena przetwarzania wstępnego

Makro X-lista jest zdefiniowana jako następujące:

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

, a następnie:

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

ale gcc daną następujących komunikatów o błędach:

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 

Jakbym powiedział, widziałem prawidłowy kod C za pomocą przełącznika -E na 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;; 

Co to jest ważny token przetwarzania wstępnego? Czy ktoś może to wyjaśnić?

(zanim powiesz „dlaczego nie po prostu albo zainicjować lub memset()?” To nie jest mój prawdziwy kod.)

Odpowiedz

36

. oddziela znaki i tak nie można używać ## jak .red nie jest ważny znak. Używałbyś tylko ##, jeśli łączysz dwa tokeny w jeden.

to działa:

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

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

To co zostanie przeanalizowany/lexed. foo.bar będzie analizowany jako 3 żetony (dwóch identyfikatorów i operatora): foo . bar Jeśli używasz ## co można uzyskać tylko 2 żetony (jeden identyfikator i jeden nieważny tokenów): foo .bar

+0

Dzięki bardzo. – Jack

+5

Czy sekcja "Wklejanie tokenów" w [tym artykule] (http://www.cprogramming.com/tutorial/cpreprocessor.html) jest po prostu błędna? – Michael

+5

@Michael Tak, jest źle. –

Powiązane problemy