Управляющая компилятором строка вида #DEFINE идентификатор строка-лексем (Обратите внимание на отсутствие в конце точки с запя-той) приводит к тому, что препроцессор заменяет последующиевхождения этого идентификатора на указанную строку лексем.Строка вида #DEFINE идентификатор(идентификатор,...,идентификатор)строка лексем где между первым идентификатором и открывающейся скобкой (нет пробела, представляет собой макроопределение с аргумен-тами. Последующее вхождение первого идентификатора, за кото-рым следует открывающая скобка '(', последовательность раз-деленных запятыми лексем и закрывающая скобка ')', заменяют-ся строкой лексем из определения. каждое вхождение идентифи-катора, упомянутого в списке формальных параметров в опреде-лении , заменяется соответствующей строкой лексем из обраще-ния. Фактическими аргументами в обращении являются строкилексем, разделенные запятыми; однако запятые, входящие в за-кавыченные строки или заключенные в круглые скобки, не раз-деляют аргументов. Количество формальных и фактических пара-метров должно совпадать. Текст внутри строки или символьнойконстанты не подлежит замене. В обоих случаях замененная строка просматривается сновас целью обнаружения других определенных идентификаторов. Вобоих случаях слишком длинная строка определения может бытьпродолжена на другой строке, если поместить в конце продол-жаемой строки обратную косую черту \ . Описываемая возможность особенно полезна для определения"объявляемых констант", как, например, #DEFINE TABSIZE 100 INT TABLE[TABSIZE]; Управляющая строка вида #UNDEF идентификатор приводит к отмене препроцессорного определения данного иден-тификатора.