GCC - The Complete Reference (537669), страница 14
Текст из файла (страница 14)
В примере макрос с именем монк содержит преобразованную к строковому типу переменную, объединяемую с другими строками, которые находятся рядом с ним в макроопределении: «Пе11пе МОНК(АИПТВВИ] Х рг1пее("ТЬе Сета " №АВОТЕВИ " 1в а всг1пяХп") иомк(А со В]( В выводе программы мы увидим: ТЬе Сект А Ео В 1в а вст1пя ° Макрос может быть определен без его значения. Несмотря на то, что он не имеет связанного с ним значения для подстановки, он, тем не менее, считается определенным и может использоваться в качестве проверяемого флага. ° Вариативиыймакрос (тапа())с тасго) содержит переменное число аргументов. Аргументы, представленные троеточием "...", сохраняются в строчной форме через запятую в стандартной переменной згА АИОЯ „расширяемой внутри макроса.
В следующем примере макрос принимает любое количество аргументов. №Пе11пе егг(...) Ерт1пс(ведетт, ЧА АВОВ ) етт("ав ти)Хп","ТЬе етгот соое ", 48)5 Вот результат на выходе препроцессора после обработки этих двух строк: ерт1пее(всоегт,"Ъв ввзХп","ТЬе егтот со((е ", 48)5 Вариативный макрос может иметь настолько большой список параметров, насколько позволяет величина содержащей его переменой. Далее — пример макроса, имеющего два фиксированных аргумента, за которыми следует открытый список параметров: б4 Часть )1. Использование Сборнсгс Компилятора «йе11пе еххоис(а,Ь,...) хрх1пс(всйехх,"У11е Ъв Ь1пе Вх)1п",а,Ъ)( ерх1пе(вецехх, уа ите ) Пример использования этого макроса: еххсис( угЬВ , Ьгня ,"Ппехрессед Еееп1пас1оп1п") Во всех предыдущих формах вариативных макросов требовалось присутствие хотя бы одного параметра, чтобы удовлетворялись требования к переменному списку параметров.
Потому что, когда мы использовали функцию йрк1пе ( ) внутри макроса, перед тгд вдов стояла запятая. Можно помещать тгд дмв в список аргументов особым оператором объединения строк, чтобы в случае пустого списка аргументов запятая была удалена. Как в таком примере: Ерх1пс№(веаехх, «« Уа Лнав ] Феггог и Фааггппя Директива «ехгок вызывает сообщение препроцессора о критической ошибке и его остановку. Она может использоваться для перехвата известных условий, при которых скомпилированный код будет заведомо неработоспособным. К примеру, следующий код будет успешно скомпилирован только в том случае, когда определен некоторый макрос с именем ип1х «1№пйех ип1х « еехсх "тЬ1в веес1оп н111 оп1у мсек оп ШПХ вувсепв" №епй11 Директива «макп1пд действует подобно директиве «еххох, за исключением того, что она не является критической, препроцессор продолжает работу после вывода сообщения. ЮИ, ФеИ, ФеЬе и ФепдИ Директива «1й вычисляет и проверяет результат арифметического выражения условия.
В случае, если он не равен нулю, то условие считается истинным. В этом случае условный код, стоящий в блоке условной директивы до соответвуюшей закрывающей директивы («е1Н, «е1ве или «епб1«), передается на выход. В противном случае условие считается ложным и код блока не передается на выход препроцессора н, соответственно, не компилируется. В примере строковая переменная объявляется только тогда, когда значение Соцввт не равно нулю. «11 Со(нгг сЬае *деве "ТЬе соипс 1е поп-веко'М «епй11 Далее перечислены правила и условия, которые применяются к условным директивам и к выражениям условий, ° Выражение условия может включать целочисленные константы и имена не- пустых макросов, те.
макросов, содержащих значение. ° Для определения порядка вычисления выражения могут применяться скобки. Глава 3. Препроцессор срр б5 Выражение может включать в себя арифметические действия в форме операторов +, —, ", /, «и», которые действуют также, как такие же целочисленные арифметические операторы в языке С. Действия производятся над числами, формат которых соответствует наибольшему целочисленному формату, поддерживаемому целевой платформой. Обычно 64 бита. Выражение может содержать операторы сравнения >, <, >, <= и =, действующие так же, как соответствующие им в языке С. Выражение может включать логические операторы пв и 11. Для логического инвертирования результата выражения может быть использован оператор отрицания "1".
К примеру, следующее выражение истинно, если ьхмхв не более 12: «йй ЩЬ|МХВ > 1З1 ° Если нужно проверить, определен ли какой-либо макрос, для этого может быть использован оператор аеййпеа. Следующее выражение истинно, только если определен макрос с именем мхвпп: «йй аеййпеа<МПия1 ° Оператор отрицания "!" часто используется в сочетании с аеййпеа для того, чтобы проверить, что макрос с интересующим именем не назначен, например: «йй ~аей1пеа!Мхмкп) ° Идентификатор, не определенный как макрос всегда возвращает нулевое значение.
Для выдачи сообщения в случае использования такого индентификатора в выражениях можно использовать опцию командной строки -мппаей. Имена макросов, определенных как имеющие аргументы, всегда возвра;щают ноль. ° Для выдачи препроцессором сообщения в подобном случае также используют опцию -мппаей. ° Директива «е1ве может быть использована для представления альтернатив- ного кода, который компилируется тогда, когда выражение условия ложно. Применение этой директивы показано в следующем примере: «йй мхнтхт <= 5 №аеййпе МхнтЬОО 11 «еьве «аеййпе мхнтьоа 14 «епайй ° Директива «е1йй используется для предоставления одного или больше альтернативных выражений, как в этом примере: «йй мхмтхт <=5 «аей1пе МхнтЬОО 11 «еьйй МхмтХт == 5 «аеййпе МхмтЬОа 1З «еьйй МхнтХт «=П «аеййпе МхмтЬОО 1З 3 А грмффю< бб Часть!1. Использование Сборного Компилятора «е1ве «сет1пе Мтйтьсс 14 «епс1« Мйе1, 10пде1„Фе!зе и тепдо Строки кода находящиеся после директивы «1Ыег компилируются при условии, что макрос с указанным именем определен.
Действие директивы «1Ыег заканчивается следующей за ней в тексте программы директивой йепб1г, В примере массив объявляется при условии, что макрос Мтытдппдт определен: «1Ыет мтитлпвдт гпе хагауг20] «епсьт г* мтмтлнат *г Комментарий в строке с директивой йеп10 не обязателен.
Он только служит для улучшения читаемости кода. Противоположной по отношению к $1Ыег является директива $1гпбег, она служит для условной компиляции стоящего после нее кода, когда указанный ею макрос не определен. Директива йе1ве может использоваться после $1Ыет для определения альтернативного кода. В приводимом примере, если макрос мХмтднпдт определен, то массив будет объявлен типа йпс, в противном случае он будет иметь тип сЬаг: «ьыет Мтитаннат 1пс хаггау[203г «е1ве спаг хаггауИ01г «епеат г* Мтмтлипдт *г Другие директивы могут включаться в код, компилируемый по условию.
Это относится также и к директивам «1Ыег, «йгпбег и «1г, однако каждой из подобных директив должна быть должным образом сопоставлена соответствующая ей «епбхг. Ф!псЫе По директиве ййпс1пбе препроцессор проводит поиск файла с указанным именем и вставляет его содержимое в текст совершенно так же, как он мог бы быть туда помещен при помощи текстового редактора. Файл, включаемый таким образом, в общем случае считается заголовочньин файлом С, его имя обычно имеет суффикс .
Ь, хотя это может быть любой текстовый файл с любым именем. Директива апс1пбе имеет две формы. Первая, используемая более для системных заголовочных файлов, помещает имя файла в угловые скобки ("апй1е Ьгасйегз"). Другая, чаще применяемая для вставки пользовательских заголовочных файлов, — в двойные кавычки. Пример для обеих форм: «1пс1пее <вуввеад.Ь> «1пс1сде "вувпеаС.Ь" Глава З. Препроцессор срр 67 Далее следует список свойств и правил, которые действуют для директивы №1пс1ийе: Если имя файла окружают угловые скобки, то поиск файла начинается с каталогов, указанных с использованием опции -1, и затем продолжается в стандартном наборе системных каталогов.
Если имя файла окружают кавычки, то поиск начинается с текущего каталога (т.е того, в котором находится исходный Файл) и затем продолжается по правилам, действующим для директивы с угловыми скобками. В системах 0Ы!Х стандартный набор системных каталогов выглядит следующим образом: /пвг/1оса1/1пс1ийе /пвг/11ыдсс-11ЫЕагдес/гегв1оп/1пс1ийе /ивг/Еагдес/1пс1пйе /пвг/1пс1пйе Для поиска заголовочных файлов используются два различных списка каталогов. Стандартные системные заголовочные файлы находятся в каталогах из второго списка.
Оция командной строки -1 добавляет каталоги в список для поиска первой очереди. Опции -ргеИх, -м1снрге11х и -1й1гайсег предназначены для манипуляций с именами каталогов во втором списке каталогов для поиска файлов. В случае, когда ОСС компилирует программу на языке С++, каталог /ивг/ 1пс1пйе/д++вэ проверяется на наличие указанного файла прежде всех других стандартных каталогов. Относительный путь к каталогу может использоваться вместе с именем файла.
Например, если вы определите директиву №1пс1пйе <вув/е1ме. Ь>, то препроцессор будет искать файл е1ве. Ь в подкаталогах вув всех системных каталогов. Символ наклонной черты "/" ("з!азЬ") всегда воспринимается как разделитель имен в пути к каталогу, даже в тех системах, которые используют для этой цели другой символ, например, обратную наклонную черту "~" ("Ьаскз(азй"). Имя файла воспринимается в таком виде, как оно указано.