Читать «Справочное руководство по C++» онлайн - страница 92

Бьярн Страустрап

Рекурсивную подстановку нельзя выполнить как команду препроцессора, хотя она кажется для него естественной командой.

R.16.3.4 Область видимости макроимен и конструкция #undef

После появления макроопределения идентификатор из него считается определенным и остается в текущей области видимости (независимо от правил областей видимости в С++) до конца единицы трансляции или пока его определение не будет отменено с помощью команды #undef.

Команда #undef имеет вид:

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

Она заставляет препроцессор "забыть" макроопределение с этим идентификатором. Если указанный идентификатор не является определенным в данный момент макроименем, то команда #undef игнорируется.

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

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

#include ‹имяфайла›

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

Аналогично, управляющая строка вида:

#include "имяфайла"

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

#include ‹имяфайла›

В имени файла, ограниченном символами ‹ и › нельзя использовать символы конца строки или ›. Если в таком имени появится один из символов ', \, или ", а также последовательность символов /* или //, то результат считается неопределенным.

В имени файла, ограниченном парой символов " нельзя использовать символы конца строки или ", хотя символ › допустим. Если в таком имени появится символ ' или \ или последовательность /* или //, то результат считается неопределенным.

Если команда

#include строка-лексем

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

Команда #include может быть в файле, который сам появился в результате выполнения другой команды #include.

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

R.16.5 Условная трансляция

С помощью препроцессора можно организовать условную трансляцию программы. Синтаксически это задается следующим образом:

условное:

 часть-if части-elif opt часть-else opt строка-endif

часть-if:

 строка-if текст

строка-if:

 # if выражение-константа