Проблема расширения макроса с помощью gcc - PullRequest
2 голосов
/ 08 марта 2019

В gcc, похоже, что ссылка на результаты макро-расширения позже внутри этого же расширения не работает. Например:

#define TESTMACRO(name) \
        static int name##_func(int solNo) { \
                return (solNo); \
        }\
        static int name##Thing = {0,##name##_func},NULL,{"", capInvSw##name}}; 

TESTMACRO(stuff)

Это приводит к таким ошибкам:

test.c:7:29: error: pasting "," and "stuff" does not give a valid preprocessing token
  static int name##Thing = {0,##name##_func},NULL,{"", capInvSw##name`}}; 
                             ^
test.c:9:1: note: in expansion of macro ‘TESTMACRO’
 TESTMACRO(stuff)

Я ожидал бы иметь функцию с именем stuff_func, созданную и переданную в stuffThing. Я считаю, что это работает в других компиляторах. Каков эквивалентный способ сделать это в gcc?

1 Ответ

1 голос
/ 08 марта 2019

Вы можете попытаться запустить только препроцессор в своем коде, передав флаг -E:

gcc -E foo.c

, который оценивает ваш макрос в:

static int stuff_func(int solNo) { return (solNo); } static int stuffThing = {0,stuff_func},NULL,{"", capInvSwstuff`}};

Это можетдля удобства чтения:

static int stuff_func(int solNo) { 
return (solNo); 
} 

static int stuffThing = {0,stuff_func},NULL,{"", capInvSwstuff`}};

И, похоже, в вашем расширенном макросе есть одна лишняя / недостающая скобка }.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...