2010-09-23 2 views

ответ

13

Вывод отличается тем, что препроцессор выполняет действия, описанные в разделе 6.10.3 (и следующие) в стандарте C99. В частности, это предложение из 6.10.3.1/1:

параметр в списке замены, если не предшествует # или ## предварительной обработки или маркер с последующим ## предварительной обработки маркер, заменяется соответствующим аргументом в конце концов макросы, содержащиеся в них, были расширены.

Таким образом, в первой линии, при расширении вызова h, аргумент f(1,2) расширяется перед тем заменяет параметр h «s a. # вступает в игру позже, когда результат, вызванный вызовом g, отображается при выводе всего, что было перепрограммировано.

Но во второй строке отображается #, и предложение «если только предшествует ...» приведенной выше цитаты вызывает другое поведение.

См. Также the relevant C-FAQ entry.

8

После того, как препроцессор делаются с макроподстановками, компилятор видит это:

int main() 
    { 
     printf("%s\n","printf(\"yes\")"); 
     printf("%s\n","f(1,2)"); 
    } 

Это обычный метод, чтобы слой в «дополнительный» окольный, чтобы контролировать, когда вы получаете stringification и когда вы получите фактический макрооценка.

В принципе, макрообследование происходит от «снаружи», а не наоборот. wikipedia page говорит, что «параметры не анализируются сначала для замены макросов», которые, я считаю, ссылаются на одно и то же.

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