Язык С

       

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


Управляющая компилятором строка вида

#DEFINE идентификатор строка-лексем

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

#DEFINE идентификатор (идентификатор,...,идентификатор)строка лексем

где между первым идентификатором и открывающейся скобкой ( нет пробела, представляет собой макроопределение с аргумен- тами. Последующее вхождение первого идентификатора, за кото- рым следует открывающая скобка '(', последовательность раз- деленных запятыми лексем и закрывающая скобка ')', заменяют- ся строкой лексем из определения. каждое вхождение идентифи- катора, упомянутого в списке формальных параметров в опреде- лении , заменяется соответствующей строкой лексем из обраще- ния. Фактическими аргументами в обращении являются строки лексем, разделенные запятыми; однако запятые, входящие в за- кавыченные строки или заключенные в круглые скобки, не раз- деляют аргументов. Количество формальных и фактических пара- метров должно совпадать. Текст внутри строки или символьной константы не подлежит замене. В обоих случаях замененная строка просматривается снова с целью обнаружения других определенных идентификаторов. В обоих случаях слишком длинная строка определения может быть продолжена на другой строке, если поместить в конце продол- жаемой строки обратную косую черту \ .

Описываемая возможность особенно полезна для определения "объявляемых констант", как, например,

#DEFINE TABSIZE 100 INT TABLE[TABSIZE];

Управляющая строка вида

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

приводит к отмене препроцессорного определения данного иден- тификатора.



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