Макрозамещение

Макрозамещение – обобщение лексемного замещения посредством параметризации строки директивы define в виде:

#define ID(параметр1,... ) строка

между элементом ID и открывающей скобкой пробелы не допускаются.

Такой вариант директивы define иногда называют макроопределением. Элемент строка обычно содержит параметры, которые препроцессором будут заменены на фактические аргументы так называемой макрокоманды, записываемой в формате

ID(аргумент1,... )

Пример макроопределения и макрокоманд:

#define P(X) printf("\n%s",X)

. . .

char *x;

P(x); // Использование макроопределения P(X)

P(" НАЧАЛО ОПТИМИЗАЦИИ");

printf("\n%s",x); // Эквивалентные операторы

printf("\n%s"," НАЧАЛО ОПТИМИЗАЦИИ");

В строке макроопределений идентификаторы параметров сложных выра­же­ний рекомендуется заключать в круглые скобки:

#define МАХ(A,B) ((A)>(B)? (A):(B))

#define ABS(X) ((X)<0? –(X):(X))

Потребность в круглых скобках возникает при опасности искажения смысла вложенных выражений из-за действия правил приоритета операций. Пример искажения смысла операций:

#define BP(X) X*X

. . .

int x,y,z;

x=BP(y+z); « x=y+z*y+z; « x=y+(z*y)+z;

Очевидно, что ошибки будут и при следующих вариантах:

#define BP(X) (X*X)

#define BP(X) (X)*(X)

Безопасный вариант:

#define BP(X) ((X)*(X))

Иногда источником ошибок может быть символ «точка с запятой» в конце строки макроопределения:

#define BP(X) ((X)*(X));

. . .


int x,y,z;

x=BP(z)–BP(y); « y=((z)*(z)); –((y)*(y));

Макроопределение отменяется директивой undef.

Идентификаторы макроопределений обычно составляют из прописных букв латинского алфавита. Это позволяет отличать макрокоманды от вызова функций.

Макрокоманда внешне синтаксически эквивалентна операции вызова функции, но смысл их различен. Функция в программе имеется в одном экземпляре, но на ее вызов тратится время для подготовки параметров и передачи управления. Каждая макрокоманда замещается соответствующей частью макроопределения, но потерь на передачу управления нет.








Дата добавления: 2014-12-30; просмотров: 586;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.003 сек.