21. Строки управления компилятором.

Компилятор языка "C" содержит препроцессор, который позволяет осуществлять макроподстановки, условную компиляцию и включение именованных файлов. Строки, начинающиеся с #, общаются с этим препроцессором. Синтаксис этих строк не связан с остальным языком; они могут появляться в любом месте и их влияние распространяется (независимо от области действия) до конца исходного программного файла.

Содержание

21.1. Замена лексем.
21.2. Включение файлов
21.3. Условная компиляция.
21.4. Управляющая строка - line.


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

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


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

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

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

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


 #define tabsize 100
 int table[tabsize];
Управляющая строка вида

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


21.2. Включение файлов

Строка управления компилятором вида


 #include "filename"
приводит к замене этой строки на все содержимое файла с именем filename. Файл с этим именем сначала ищется в справочнике начального исходного файла, а затем в последовательности стандартных мест. В отличие от этого управляющая строка вида

 #include <filename>
ищет файл только в стандартных местах и не просматривает справочник исходного файла.

Строки #include могут быть вложенными.


21.3. Условная компиляция.

Строка управления компилятором вида


 #if константное выражение
проверяет, отлично ли от нуля значение константного выражения (см. п. 24). Управляющая строка вида

 #ifdef идентификатор
проверяет, определен ли этот идентификатор в настоящий момент в препроцессоре, т.е. определен ли этот идентификатор с помощью управляющей строки #define. Управляющая строка вида

 #ifndef идентификатор
проверяет, является ли этот идентификатор в данный момент не определенным для препроцессора.

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


 #else
и затем управляющая строка

 #endif
Если проверяемое условие истинно, то любые строки между #else и #endif игнорируются. Если проверяемое условие ложно, то любые строки между проверяемой строкой и #else или, при отсутствии #else, #endif игнорируются.

Эти конструкции могут быть вложенными.


21.4. Управляющая строка - line.

Для других препроцессоров, генерирующих "C"-программы, используется строка вида


 #line константа идентификатор
которая приводит к тому, что компилятор в целях диагностики ошибок полагает, что следующая строка исходного файла имеет номер, задаваемый константой, и что текущий входной файл именуется этим идентификатором. Если идентификатор отсутствует, то запоминаемое имя файла не изменяется.

Наш баннер
Вы можете установить наш баннер на своем сайте или блоге, скопировав этот код:
RSS новости