Препроцессор C: строковый макрос и макрос идентификации

Я хочу знать причину вывода этого кода. Я не мог придумать ответа.

#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
void main()
{
   printf("%s %s",h(f(1,2)),g(f(1,2)));
}

PS: вывод 12 f(1,2). Я думал, что это 12 12 или f(1,2) f(1,2).


person Vindhya G    schedule 23.07.2012    source источник
comment
просто чтобы узнать, как работает препроцессор ...   -  person Vindhya G    schedule 23.07.2012
comment
@cnicutar Я думаю, он нашел это здесь: cracktheinterviewers.blogspot.com/2012_03_01_archive.html   -  person Dave    schedule 23.07.2012
comment
это не я писал .. это было задано на тесте ..   -  person Vindhya G    schedule 23.07.2012
comment
спасибо за ссылку .. полагаю может быть полезно   -  person Vindhya G    schedule 23.07.2012
comment
На самом деле результат может отличаться в разных компиляторах. Известно, что препроцессоры в GCC и Visual C ++ работают по-разному и будут производить разные выходные данные для одного и того же кода.   -  person Some programmer dude    schedule 23.07.2012
comment
@Dave Эта ссылка просто сообщает ответ, но не объясняет почему.   -  person Some programmer dude    schedule 23.07.2012
comment
@JoachimPileborg: Итак, это не определено ... но почему компилятор не будет работать одинаково для первого и второго ... я имею в виду, что если он дает 12 для первого, компилятор должен делать то же самое для второго, верно?   -  person Vindhya G    schedule 23.07.2012
comment
@vindhya: он определен, но есть дрянные компиляторы ...   -  person Karoly Horvath    schedule 23.07.2012
comment
Вы можете найти на вашем компиляторе флаг остановки после предварительной обработки. Таким образом, вы будете знать, каков результат расширения макроса.   -  person nhahtdh    schedule 23.07.2012
comment
Порядок оценки важен. Сначала обрабатывает вызов f или g?   -  person Some programmer dude    schedule 23.07.2012
comment
но я хочу знать, как предсказать такие вещи? Почему именно существует разница между первым и вторым? если по порядку оценки первое и второе должны быть одинаковыми, верно?   -  person Vindhya G    schedule 23.07.2012


Ответы (2)


h(f(1,2))

f(1,2) заменяется на a. a не является предметом операторов # или ##, поэтому он расширяется до 12. Теперь у вас есть g(12), который расширяется до "12".

g(f(1,2))

f(1,2) заменяется на a. Оператор #, примененный к a, предотвращает расширение макроса, поэтому результат буквально "f(1,2)".

person Potatoswatter    schedule 23.07.2012
comment
о ... хорошо, спасибо ... я не концентрировался на работе оператора # - person Vindhya G; 23.07.2012
comment
@vindhya Это все кровавое месиво. - person Potatoswatter; 23.07.2012

Просто сделай замены.

h(f(1, 2)) -> g(12) -> "12"

g(f(1,2)) -> "f(1, 2)"

Вы также должны увидеть здесь.

person md5    schedule 23.07.2012