Г. Шилдт - Полный справочник по C++ (1109478), страница 43
Текст из файла (страница 43)
Посмотрим, *по произойлет, если убрать скобки закрут макроса а. В этом случае выражение $ лпв(10-20) после макрополстановки будет преобразовано в следующий оператор. $10-20<0« т -10-20 ; 10-20 Очевилно, что результат этого выражения будет ошибочным. Использован««е функциональных л«акросов вместо настоящих функций увеличи. ваег скорость выполнения программы, поскольку в ней отсутствуют вызовы функций. Однако, если размер функционального макроса достаточно велик, быстролействие программы постигается в ущерб ее размеру, поскольку многие фрагменты программы просто лублируются. дауд~))З)ЗЗЗ1~д Несмотря на пю ч«па параметризованные макросы давильна напевны, в языке Йййеч)ееввме Ся+ есть бапвв аффективный способ создания падстввляемоеа када, основанный нв использовании ключеваеа слава Хазуев.
Й Директива Феггог Директива Меггаг вынужлает компилятор прекратить компиляцию. Она используется в основном при отладке программ. Общий вид директивы ()еггог таков. й Яеггог сааба(вн««е аб аитбке Параметр сааб)яв««ив агу ои«ибке представляет собой строку, не заключенную в кавь)чки. При выполнении директивы ()еггаг на экран выводится сообщение об ошибке, которое может сопровождаться другой информацией, определенной компилятором.
Часть 1. Основы языка С++: подмножество С :~ Директива Фпс!обе Директива «апозцете вынуждает компилятор считать и подставить в исходный текст программы фаил с заданным именем. Это имя заключается в двойные кавычки или угловые скобки. Например, директивы аапс1иое "еес11о.ц" Фапс1цое <всоао.ц> заставляют компилятор считать и скомпилировать заголовочные файлы стандартных библиотечных функций ввода-вывода.
Включаемые файлы сами могут содержать директивы Мапо1цете. Такие директивы называются влоаееннымц Глубина вложения директив зависит от компилятора. Стандарт языка С попускает восемь уровней вложения, а стандарт языка С+о — по крайней мере 256. Кавычки и угловые скобки, в которых указываются имена включаемых файлов, опрелеляют способ их поиска на жестком лиске. Если имя файла содержится в угловых скобках, он должен находиться в каталоге, указанном компилятором.
Обычно зто каталог жстхлж, предназначенный лля хранения всех заголовочных файлов. Если имя файла заключено в кавычки, как правило, его поиск выполняется в рабочем каталоге. Если файл не найлен, поиск повторяется так, будто имя файла содержалось в угловых скобках.
Большинство программистов заключают в угловые скобки имена заголовочных фаилов, а кавычки оставляют для файлов, определенных пользователем. Однако на этот счет никаких жестких правил не прелусмотрено. Каждый программист волен поступать так, как ему удобно. Программы на языке С++ могут использовать директиву «1по1цое для включения не только файлов, но и заголовков ()зеаг)егз). В языке С++ предусмотрен набор сгандарзных заголовков, содержаших информацию, необходимую для работы различных библиотек. Заголовок представляет собой стандартный идентификатор, который может, но не обязан, являться именем файла.
Таким образом, заголовок в языке С++ — зто абстракция, гарантирующая, что в программу будет включена необходимая информация. Различные вопросы, связанные с использованием заголовков, обсуждаются в части П. -=~ Директивы условной компиляции Препроцессор содержит несколько директив, позволяюших выборочно компилировать отдельные части программы. Этот процесс называется условной компиляцией (сопсййопа) согпрйайоп). Он широко используется в коммерческих приложениях, поскольку позволяет настраивать их на конкретное окружение. Директивы №Ы, №е!ве, №еЫ и №епбЫ Вероятно, наиболее распространенными директивами условной колшиляции являются директивы ()1а, ()е1ае, «азха И аепааа. Эти директивы позволяют выбирать компилируемые части программы в зависимости от значения константного выражения.
Директива «1е имеет следуюший обгций вид. Ф 1 Х ховгвшптное вмраэкевое лосзедовоглсльвосгль овврвлюров аепбаб гы Глава 10. Препроцессор и комментарии Если значение константного выражения истинно, код, заключенный межлу директивами ФЕЕ и «епа1Е, компилируется. В противном случае эта часть программы игнорируется. Директива «епаЕЕ отмечает конец блока директивы аЕЕ. Рассмотрим пример. /* Простой пример директивы ЛЕЕ. */ Лтпс1пбе <аебто.)т> ФбеЕЕпе ИАХ 100 1пе шадп(уоЫ) ( ФЕЕ ИАХ>99 ргдпсЕ("Компилируется, если размер массива больше аепс)1Е 99.~п"); геессп О; ) /* БЕшр1е ФЕЕ/Фе1ве ехашр1е. */ Фдпс1иде <всг)то.)з> ас)еЕЕпе ИАХ 10 Епе шатп(уоЫ) азе иАх>99 рттпсЕ("Компилируется, если размер массива больше 99.~п"); ае1ае ргйпСЕ("Компилируется, если размер массива мал.
1п"); Мепг)ЕЕ геепгп Оу ) В данном случае значение именованной константы ивх меньше 99, поэтому часть программы, указанная после директивы Ме, не компилируется. Вместо нее компилируется альтернатива, связанная с директивой «е1ве, н на экране появляется сообшение "Коипилируетси, если размер массива иал'*. Обратите внимание на то, что директива Ме1ве одновременно является концом блока «ее и началом альтернативного блока, поскольку директива МЕЕ может иметь только одну альтернативу Ме1ве. Директива «е11Е означает "е(зе!Г и создает цепочку ЕЕ-е1ве-ЕЕ, позвояля выполнять многовариантную условную компиляцию.
Если выражение истинно, компилируется связанный с ним блок кола, а остальные выраженги Ме11е не вычисляются. В противном случае проверяется следуюший блок. Обший вид директивы ае11Е таков. Часть!. Основы языка С++: подмножество С Эта программа выводит на экран сообщение, поскольку значение именованной константы илх больше 99. Этот пример иллюстрируе~ олин очень важный люмент. Выражение, стояшее после лирективы $1Е, вычисляется на этапе компиляции. Таким образолп оно может содержать лишь ранее определенные идентификаторы и константы, но не переменные.
Директива «е1ве идентична оператору етве, являюшемуся частью языка С++: она определяет альтернативу директиве МЕ. Предыдущий пример можно немного усовершенствовать. В1Е выражение пощедоволневьность операторов Вв11Е вьражение! последовательность операторов Вв11й выражение 2 последовательность операторов Ве11Е выражение 3 последовапмльность операторов Вв11Е выражение 4 Ведйй выражение Аг последовательность оперопюров ВепПЕЕ Например, следующий фрагмент использует значение именованной константы Астхче сопитпу лля определения знака, обозначающего валюту. ас]ейзпе ЧБ 0 Вс[ей1пе ЕИОХАИО 1 Ес]еййпе РЯАИСЕ 2 Вс[ей1пе АСТХЧЕ СООИТЯУ СБ Фйй АСТХЧЕ СООИТЕУ --= ПБ сваг сцггепсу[] = "доллар"," Ве11й АСТХЧЕ СООИТЕу =.= ЕИОТ.АИО с[заг соггепсу[] = "суит"; Ве1ае спас сцггепсу[] = "Вранк"г Веодйй Станларг языка С устанавливает, что директивы ВЕЕ и Ве11Е люгуг быть вложенными, а глубина вложения может постигать по крайней мере восьми уровней.
Станларт языка С++ допускает 256 уровней вложения. Вложенные лирективы Вепдйй, Вв1ве или Ве11Е связываются с ближайшими директивами ВЕЕ или Ве11й. Например, следующий фрагмент абсолютно верен. айй ИАХ>100 Фйй БЕРХАЬ ЧЕЕБХОИ 1пг роге=190г Ве11й йпе рогей200г Веос[1й Ве1ве с[тат оог Ьыййег[100] Вепс]йй Директивы ФЫе1 и Нпбе1 Другой способ условной компиляции основан на применении директив В1йе]ей и В1еппей, означающих "[Г дейпед" (если определено) и "[Г пог г]ейпед*' (если не определено). Общий вид директивы Вйеьтее таков. Глава 10.
Препроцессор и комментарии «ййствй имя макроса носяедовамеяьность операторов «апс(й Е Если и)вя макроса ранее определено с помощью директивы «пвййпа, компилируется соответствующий блок кола. Директива «ййп()вй имеет слелуюшид общий вид. | «ййпйей амя макроса носяедоватеяьноонь онераторов «впстйй Если имя макроса не было определено с помощью директивы «()вй1пв, компилируется соответствующий блок кода. Директивы «ййетвй и «1йпствй могу( использовать директивы «втво И «е11Е.
Например, слелуюший фрагмент программы выводит на экран строки "Прива~, Тая'* и "Раль«а иат лома". Однако, если именованная коне~апта твп не определена, на экран выводится сообщение "Воем привет", а затем — "Раль«а нет дома". «йпстыс)е <вес)1о.п> «деййпе Тнр 10 йпс пайп(мойс)) ( «ЕЫей Твр ргйисй(тлрИВЕт, ТелЪп"); «е1ве ртй пей ( твоем привет(п" ); «еыс)1( «ййпдей НА~,РН рс)пей("Раль«а нет ломатп"); аеас)1й тесытп 0; ) Директивы «йес(ве и «Ееппве могут быть вложенныл(и, причем стандарт языка С допускает как минимум восемь уровней вложения, а станларт языка С++ — до 256.
Директива «ыпоей улаляет определение указанного имени макроса. Иными словами, эта директива делает макрос неопределенным. Общий' вил директивы «подай таков В «ыпс)ей имяРдткроса Рассмотрим, например, слелуюшид фрагмент программы «деййпе ЬВН 100 «с)еййпе ИХПТН 100 сЬат агхау[?.НИ] [Итрти]; «ыпс]ей 1КИ «падей ИТОН Часть ). Основы языка С++: подмножество С /* В этой точке именованные константы ЬЕН и ЮШТН не определены "/ Ил~енованные константы тлм и )гептн считаются определенными, пока не будет вы- полнена директива апп((еЕ.
~е' Оператор бейпеб Кроме директивы Медее, есть еше один способ проверить, определено ли имя макроса. Для этого можно применять директиву ЫЕ в сочетании со статическим оператором деЕЕпект. выполняемым на этапе компиляции. Оператор стеЕЕпед имеет следуюший обший вид. й с)е(йпес) азы микроса Если в данный момент имя макрсса является определенным, выражение имеет истинное значение.