GCC - The Complete Reference (537669), страница 16
Текст из файла (страница 16)
В точности, какие из них определены, и какие они содержат значения, зависит от языка компиляции, назначаемых опций командной строки, используемой "домашнеи" платформы, преднаначаемой целевой платформы, версии запускаемого компилятора и установленных переменных окружения. Можете использовать опцию препроцессора -г)м, чтобы увидеть весь их список. Подаваемая для этого команда должна выглядеть примерно так; срр -Е -дн шургод.с ! ноге ! шоге Таблица 3.2. Основной набор предопределенных макросов )( иввроо Строка е кавычках, содержащая полный путь к каталогу, где находится исходный файл, назначенный командной строкой (не обязательно файл, в котором используется макрос).
См. также ргьн Взвв ВХЬН Макрос назначаемый, чтобы показывать что символьный тип, действущий на целевой машине, является беззнаковым. Он используется в 11ш1кв.н для определения значений СНВН НХН И СНАН НАХ. снва онвханно Определяется топько тогда, когда исходный код ЯвляЕтея программой нв языке С++, Он определен квк "1", если компилятор не вполне соответствует полному набору правил стандарта; в противном случае определяется месяцем и годом выпуска стандарта так же, как вттю уннвхон для языка С.
ср1ивр1из Заключенная в кавычки строка из 11 символов, содержащая календарную дату, когда программа была сксмпилирована. Имеет такой формат: "шву 3 2002" рзтн Список, выводимый по этой команде, содержит директивы «бегзце ДЛя КаждО- го макроса, определенного препроцессором после обработки указанного исходного файла и всех включаемых им заголовочных файлов. Таблица 3.2 содержит список макросов, почти всегда определяемых, и описание каждого из них. 72 Часть И.
Использование Сборного Компилятора Имв маэ)эвва Хиос РОНСРХОН енес омсс мхнов ОНВС РАТСНЬЕУЕЬ хнсьвве ьеуеь ьхне НО ХНЬХНЕ овос ОРРХМХЕЕ ОРТХМХ2Е ВХ2Е ЕЕОХВТЕЕ РВЕРХЕ вовс втвс новтев втвс уеетхон Строка в кавычках, содержащая имя исходного файла, в котором применен макрос. См, также авве Рхье то же, что и Рвнстхон Строка в кавычках, содержащая имя текущей функции. Макрос, всегда определяемый как старший номер версии компилятора. Например, если номер версии компилятора 3.!.2, то этот макрос определяется значением "3". Макрос, всегда определяемый как младший номер версии компилятора (т.е.
номер выпуска). Например, если номер версии компилятора 3.!.2, то этот макрос определяется значением "1". Макрос, всегда определяемый как номер редакции выпуска компилятора. Например, если полный номер версии компилятора 3.! .2, то этот макрос определяется значением "2". Определяется при использовании компилятора С++. Этот макрос определяется в любом случае, независимо от того, что ср1овр1ов и омсс также определены. Целочисленное значение, показывающее текущую глубину включаемого ((пс(обе) файла. для основного (назначенного в командной строке) файла равно "0", и увеличивается на единицу внутри каждого следующего файла, включаемого в предыдущий файл имеющейся в нем директивой в1пс1оее.
Номер строки файла, в котором используе~се макрос. Определяется как "1" в любом случае отсутствия (п((пе- функций, которые должны подстанавливаться кодом их определения, как из-за отсутствия оптимизации, так и в силу намеренной блокировки воэможности подстановки кода таких функций. Определяется как "1" в случае, если код компилируется как пРогРамма на язЫке ОЬ!вс(ве-С.
Макрос определен как "1", если назначен любой уровень оптимизации. Макрос определен зачением "1", когда назначена оптимизация размера программы за счет быстродействия. Этот макрос — не строка, а указатель ((океп). Он указывает префикс для зарегистрированных программ. Может применяться для написания ассемблерного кода, переносимого на различные варианты окружения. Определяемый как -1", показывает, что компилятор соответствует правилам стандарта языка С. Макрос не определяется при компиляции программ на языках С++ и ОЬ)ес(фе-С, и когда назначена опция -ьвво1ь1олв1. Определяется как "1" в "дружественном" (Поз(ео) окружении (таком окружении, в котором доступны все стандартные библиотеки функций языка С) Значение типа Хоев 1лэееек, определяющее версию стандарта в форме года и месяца его выпуска.
Например, версия стандарта 1999 года будет представлена значением "199901ь", Этот макрос не определяется при компиляции программ на языках С++ и ОЬ)вовке-С, и когда назначена ОПЦИЯ -Эхао1Э1спв1. Глава 3. Препроцессор срр 73 Оимсвммв Определяется только тогда, когда в командной строке назначена хотя бы одна из опций -еовт и -все. Используется в заголовочных файлах (Пеапег Мез) ОНО для ограничения применяемых определений условиями стандарта.
Строка в кавычках из восьми символов, содержащая время компиляции программы в формате "10: 10: зе". Этот макрос — не строка, а указатель ((охеп). Он указывает префикс перед символическими именами в ассемблерном коде. Указатель меняется в зависимости от платформы, но обычно ссылается на символ подчеркивания " ". Определяется как "1", если механизм обработки исключений установлен зжр и 1ооязир. Полный номер версии.
Дпя атой информации нет особого формата представления, однако она содержит по крайней мере старший номер версии и номер выпуска. втехст янах ттие овее ьзлеь РаеРтх овхио воьо ехсеРР1омв РЕВВХОИ Таблица 3.3 содержит подборку ключевых языка С++, заменяющих имена операторов, обычно набираемых символами пунктуации. Они воспринимаются препроцессором так же, как если бы они были макросами, определенными с помощью директив йгзей1пе. Если вас интересуют их определения, то подобные им макросы для С и 0(уесггуе-С определяются в заголовочном файле Ьво6 4 6.)т. Таблица 3.3. Именная форма логических опе второе в языке С++ Лмв виврвтдрв Зямммвввмтивм вму 4кврив а ириивмвмиви вмвевв иуммтувммм аяа еч шкапе Ысох соиР1 яок еа хох ео Включение заголовочного файла единственный раз В связи с тем, что одни заголовочные файлы включают другие, может оказаться что вы обзавелись программой, которая включает один и тот же заголовок более одного раза.
Это может приводи~ь к появлению сообщений об ошибках, связанных с тем, что уже определенные элементы кода будут определяться снова. Для предотвращения подобных приключений заголовочный файл должен иметь особый код, который "отлавливает" такую ситуацию, определяет, не вставлялся ли уже текущий обрабатываемый файл. 74 Часть!!.
Использование Сборного Компилятора /* шуцеасет.ц «/ Взяпсеа МТНЕАРЕЕ Н Все11пе МУНЕАПЕЕ Н /" Тело эаголавочлогс Файла */ Вепря /* МУНЕАПЕЕ Н */ В этом примере, заголовочный файл называется шуЬеабег. )ь Первая строка проверяет, определялся ли ранее макрос МТНЕА))ЕЕ Н. Если так, то собственно условный код тела заголовочного файла пропускается препроцессором. Этот прием применяется во всех системных заголовочных файлах. Все определяемые в них имена начинаются знаком подчеркивания, чтобы они не конфликтовали с именами, которые назначаются пользователями. Соглашение, действующее на имена„определяемые для предотвращения повторного включения, состоит в том, это имя должно состоять из прописных букв н содержать в себе имя файла.
Препроцессор б)ЧП распознает эти конструкции и ведет список заголовочных файлов, которые их применяют. Таким способом он оптимизирует обработку кода заголовочных файлов, распознавая имена файлов, и даже не читает файлы, когда они уже включены в программу. Включение информации о расположении кода в сообщения об ошибках Предопределенные макросы могут использоваться для автоматизации построения сообщений об ошибках, которые содержат подробную информацию о расположении и типе найденной ошибки. Предопределенные макросы е1ье Ь1МЕ и Екпс содержат необходимую информацию, но они должны быть применены в том месте, где создается сообщение. Следовательно, если вы напишете функцию, которая содержит все эти макросы, то сообщение будет выдано с указанием имени функции, файла и номера строки.
Прекрасным решением этой задачи будет определение макроса, который содержит все эти предопределения. Таким образом, после того, как препроцессор произведет подстановку для этих макросов, все они займут соответствующие им места, и будут содержать точную информацию. Далее следует пример макроса, выдающего сообщение в случае стандартной ошибки; Ваев1пе швд(вес) Ерв1псв(вссегс,«РЬ1е: Ъв Ьвпе: «ва Ропсс1оп: ««вХп««вХп", Р1ХЕ , ЬХМЕ , йппс ,все)г Для вызова этого макроса из любого места кода, нужно только определить строку описывающую ошибку: швд(«тиеге 1в ап егсог 'песе.«); Другое преимущество такого способа состоит в том, что ваш метод обработки ошибочных условий может быть изменен простым изменением макроса.