Чтение онлайн

на главную - закладки

Жанры

Справочное руководство по C++

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

Шрифт:

Например, если есть макроопределения

#define path(logid,cmd) "/usr/" #logid "/bin/" #cmd

то макровызов

char* mytool=path(joe,readmail);

приведет к такому результату:

char* mytool="/usr/" "joe" "/bin/" "readmail";

После конкатенации соседних строк (§R.16.1) получим:

char* mytool="/usr/joe/bin/readmail";

R.16.3.2 Операция ##

Если в строке замены между двумя лексемами, одна из которых представляет параметр

макроопределения, появляется операция ##, то сама операция ## и окружающие ее обобщенные пробелы удаляются. Таким образом, результат операции ## состоит в конкатенации.

Пусть есть макроопределение,

#define inherit(basenum) public Pubbase ## basenum, \

 private Privbase ## basenum

тогда макровызов

class D: inherit(1) {};

приведет к такому результату:

class D: public Pubbase1, Privbase1 {};

Макроопределение, которое в строке замены соседствует с ##, не подлежит подстановке, однако, результат конкатенации может использоваться для подстановки. Приведем пример. Пусть есть определения:

#define concat(a) a ## ball

#define base B

#define baseball sport

Тогда макровызов

concat(base)

даст в результате

sport

а вовсе не

Bball

R.16.3.3 Повторный просмотр и дальнейшие подстановки

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

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

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 выражение-константа

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

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

части-elif:

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

 части-elif строка-elif текст

строка-elif:

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

часть-else:

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

строка-else:

 # else

строка-endif:

 # endif

Константные выражения в #if и #elif (если эти части есть) вычисляются в порядке их задания в тексте до тех пор, пока одно из них не окажется отличным от нуля. Операторы С++, следующие за строкой, в которой выражение оказалось равным нулю, не транслируются. Команды препроцессора, идущие за этой строкой игнорируются. После того, как найдена команда с ненулевым значением выражения, текст всех последующих частей #elif и #else (т.е. операторы C++ и команды препроцессора) игнорируется. Текст, относящийся к первой команде с ненулевым значением выражения подлежит обычной препроцессорной обработке и трансляции. Если значения всех выражений, указанных в #if и #elif, оказались равными нулю, тогда обычной обработке подлежит текст, относящийся к #else.

Поделиться:
Популярные книги

Толян и его команда

Иванов Дмитрий
6. Девяностые
Фантастика:
попаданцы
альтернативная история
7.17
рейтинг книги
Толян и его команда

Кодекс Крови. Книга IХ

Борзых М.
9. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IХ

Кодекс Охотника. Книга XV

Винокуров Юрий
15. Кодекс Охотника
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XV

Мастер Разума II

Кронос Александр
2. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.75
рейтинг книги
Мастер Разума II

Идеальный мир для Социопата 4

Сапфир Олег
4. Социопат
Фантастика:
боевая фантастика
6.82
рейтинг книги
Идеальный мир для Социопата 4

Проклятый Лекарь V

Скабер Артемий
5. Каратель
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Проклятый Лекарь V

Live-rpg. эволюция-5

Кронос Александр
5. Эволюция. Live-RPG
Фантастика:
боевая фантастика
5.69
рейтинг книги
Live-rpg. эволюция-5

Сонный лекарь 6

Голд Джон
6. Сонный лекарь
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Сонный лекарь 6

Сумеречный стрелок

Карелин Сергей Витальевич
1. Сумеречный стрелок
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок

Мимик нового Мира 8

Северный Лис
7. Мимик!
Фантастика:
юмористическая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 8

Титан империи 4

Артемов Александр Александрович
4. Титан Империи
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Титан империи 4

Бездомыш. Предземье

Рымин Андрей Олегович
3. К Вершине
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Бездомыш. Предземье

Возвышение Меркурия. Книга 16

Кронос Александр
16. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 16

Генерал Скала и сиротка

Суббота Светлана
1. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Генерал Скала и сиротка