После появления макроопределения идентификатор из него считается определенным
и остается в текущей области видимости (независимо от правил областей видимости в
С++) до конца единицы трансляции или пока его определение не будет отменено с
помощью команды #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 выражение-константа
# ifdef идентификатор # ifndef идентификатор части-elif: строка-elif текст части-elif
строка-elif текст строка-elif: # elif выражение-константа часть-else: строка-else текст
строка-else: # else строка-endif: # endif Константные выражения в #if и #elif (если эти
части есть) вычисляются в порядке их задания в тексте до тех пор, пока одно из них
не окажется отличным от нуля. Операторы С++, следующие за строкой, в которой
выражение оказалось равным нулю, не транслируются. Команды препроцессора,
идущие за этой строкой игнорируются. После того, как найдена команда с ненулевым
значением выражения, текст всех последующих частей #elif и #else (т.е. операторы
С++ и команды препроцессора) игнорируется. Текст, относящийся к первой команде с
ненулевым значением выражения подлежит обычной препроцессорной обработке и
трансляции. Если значения всех выражений, указанных в #if и #elif, оказались
равными нулю, тогда обычной обработке подлежит текст, относящийся к #else. В
выражении-константе, которое встретилось в #if или #elif можно использовать
унарную операцию de•ned, причем в двух вариантах: de•ned идентификатор или
de•ned (идентификатор) Если эта операция применяется к идентификатору, который
был определен с помощью команды #de•ne, и если это определение не было отменено
командой #undef, то результат равен 1, иначе результат равен 0. Сам идентификатор
de•ned нельзя переопределить, нельзя и отменить его определение. После
применения операций de•ned происходит раскрытие всех всех макроопределений,
имеющихся в константном выражении см. $$R.16.3. В результате должно получиться
целочисленное выражение-константа, отличающееся от определения в $$R.5.19 тем,
что типы int и unsigned int рассматриваются как long и unsigned long соответственно, а