Я реализую макрос X, но у меня проблема с простым расширением макроса. Этот макрос (см. Ниже) используется в нескольких примерах использования макросов, включая статью this
.
Компилятор выдает сообщение об ошибке, но я могу видеть действительный код C, используя флаг -E
с компилятором GCC.
Список макросов X определяется следующим образом:
#define LIST \
X(red, "red") \
X(blue, "blue") \
X(yellow, "yellow")
И затем:
#define X(a, b) foo.##a = -1;
LIST;
#undef X
Но 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
Как я уже сказал, я могу видеть действительный код C с помощью -E
switch on 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;;
Какой действительный токен предварительной обработки? Может кто-нибудь объяснить это?
(прежде чем вы скажете "почему бы не просто инициализировать или memset()
?" это не мой настоящий код.)