Операционная система UNIX. Руководство программиста

       

Замена лексем


Командная строка вида

#define идентификатор цепочка_лексем

заставляет препроцессор заменить последующие вхождения идентификатора на указанную цепочку_лексем. Знаки точки с запятой внутри или в конце цепочки_лексем являются частью цепочки. Строка вида

#define идентификатор(идентификатор,...) цепочка_лексем

где символ ( идет вплотную за первым идентификатором, является определением макроса с параметрами. Допускается произвольное число формальных параметров, в том числе ни одного. Последующие вхождения первого идентификатора, за которым следует открывающая скобка (, далее последовательность лексем, разделенных запятыми, и закрывающая скобка ), заменяются цепочкой_лексем из определения, при этом каждое вхождение идентификатора, упомянутого в списке формальных параметров, в цепочке_лексем заменяется соответствующим фактическим параметром.

Фактические параметры - это последовательности лексем, разделенные запятыми; однако запятые в текстовых константах или внутри вложенной пары скобок параметры не разделяют. Число формальных и фактических параметров должно быть одинаковым. Препроцессор просматривает текстовые и символьные константы в цепочке_лексем из определения и выделяет в них формальные параметры, однако вне цепочки_лексем подобные константы на предмет выполнения подстановок не просматриваются.

После подстановки цепочки_лексем результирующий текст вновь просматривается в поисках других вхождений идентификаторов, определенных директивами #define. Длинное определение может быть продолжено на следующей строке, для чего в конце продолжаемой строки нужно поместить знак \.

Описанная возможность особенно полезна для наделения констант мнемоничными именами, как в следующем примере:

#define TABSIZE 100

int table [TABSIZE];

Командная строка вида

#undef идентификатор

заставляет препроцессор отбросить определение идентификатора (если таковое было).

Если идентификатор в последующей директиве #define определяется повторно, а директивы #undef между определениями нет, то две цепочки_лексем сравниваются текстуально. Если они не совпадают (все символы-"невидимки" в данном контексте эквивалентны), считается, что идентификатор переопределяется. Об этом выдается предупреждающее сообщение.



Содержание раздела