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.)
Dzięki bardzo. – Jack
Czy sekcja "Wklejanie tokenów" w [tym artykule] (http://www.cprogramming.com/tutorial/cpreprocessor.html) jest po prostu błędna? – Michael
@Michael Tak, jest źle. –