Я только что узнал, что gcc, кажется, рассматривает результат расширения функционально-подобного макроса как отдельный токен. Вот простой пример, показывающий поведение GCC:Расширение функционально-подобного макроса создает отдельный токен
#define f() foo
void f()_bar(void);
void f()bar(void);
void f()-bar(void);
Когда я исполняю gcc -E -P test.c
(работает только препроцессор), я получаю следующий результат:
void foo _bar(void);
void foo bar(void);
void foo-bar(void);
Похоже, что, в первую два определения, gcc вставляет пространство после расширенного макроса, чтобы гарантировать, что это отдельный токен. Это действительно то, что здесь происходит?
Является ли это обязательным для любого стандарта (я не мог найти документацию по теме)?
Я хочу сделать _bar
часть того же токена. Есть какой-либо способ сделать это? Я мог бы использовать оператор конкатенации токенов ##
, но для этого потребуется несколько уровней макросов (поскольку в реальном коде f() более сложный). Мне было интересно, есть ли простое (и, вероятно, более читаемое) решение.
Is google down? Вы даже не пытались найти C [стандарт] (http://port70.net/~nsz/c/c11/n1570.html#6.10.3), который ** явно ** является авторитетным источником для консультаций. – Olaf
@Olaf - я не нашел явного утверждения, отвечающего на мой вопрос ни в C99, ни в ссылке, на которую вы указали меня. – martinkunev
Справедливости ради следует отметить, что поведение, описанное в стандарте, не совсем очевидно. Я предполагаю, что ключевое слово заключается в том, что препроцессор заменяет макрос * токенами *, что означает, что для этого на самом деле будут вставлены пробелы. – nemetroid