2016-05-16 3 views
1

Предположим, что мы проходим следующее препроцессора gcc «s:Вызов многофункционального макроса без круглых скобок?

#define REM(...) __VA_ARGS__ 
#define PAIR(x) REM x 

PAIR((a)b) 

Он расширяет PAIR((a)b) в a b. Как это произошло? Я смущен о REM используется без скобок и x не вторит как ...

+2

После замены 'PAIR ((a) b)' 'с помощью REM (a) b' препроцессор возвращается к началу замененного текста и выполняет его пересканирование в виде последовательности токенов. Довольно очевидно. –

ответ

3

Когда вы пишете:

PAIR((a)b) 

дано определение

PAIR(x) REM x 

, что означает, что х = (a)b. Таким образом, мы можем записать правую сторону как

REM (a)b 

Право?

Теперь REM(a) просто a, так REM (a)b просто a b (маркеры разделяются пробелами, если явно не использовать маркер склеивание).

Смежные вопросы