Задачи по языку С



         

Препроцессор 1.1


int x=2;
PRINT( x*FIDGE(2) ); Чтобы понять эффект макроподстановки препроцессора, нужно провести ее в месте вызова
PR(a); putchar('\n') Всегда производится самая левая макроподстановка.

Сначала вызов заменяется строкой макроподстановки.

PR(x*FIDGE(2)); putchar('\n') Затем аргументы заменяются на соответствующие строки
printf("a = %d\t",(int)(a)) Опять производится самая левая макроподстановка, на этот раз PR.
printf("x*FIDGE(2) = %d\t", (int)( x*FIDGE(2))) Подставляются аргументы макроподстановки.
printf("x*FIDGE(2) = %d\t", (int)( x* k+3.14159)) Имя макроподстановки, встречающееся в строке, не заменяется, но аргументы макроподстановки, встречающиеся в строке подстановки, заменяться должны. Значит, a в макроподстановке PR заменяется на x*FIDGE(2), но FIDGE(2), встречающееся при задании формата печати в обращении к printf, не заменяется.
(int)( x* 2+3.14159) Заменяя формальный параметр на фактический, получаем неожиданный результат. Сначала умножаем, затем складываем и отбрасываем дробную часть.

Внимание! Макроподстановки могут быть источником трудно уловимых ошибок. Макроподстановка - это только замена одних строк на другие. Препроцессор ничего не знает о языке С. Поэтому многих неожиданных результатов можно избежать, если строго следовать нескольким правилам.

Правило 1. Заключайте в скобки строки-подстановки, если они содержат операции.

Нежелательного взаимодействия между строкой-подстановкой и контекстом в приведенной задаче не было бы, если бы FUDGE(k) определялось как (k+3.14159).




Содержание  Назад  Вперед