Читать «Справочное руководство по 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 выражение-константа