Spec-Zone.ru › GCC 9

3.12 Параметры управления препроцессором

Эти параметры управляют препроцессором C, который выполняется над каждым исходным файлом C перед фактической компиляцией.

Если вы используете параметр -E, ничего не делается, кроме предобработки. Некоторые из этих параметров имеют смысл только вместе с -E, потому что они приводят к тому, что вывод препроцессора непригоден для фактической компиляции.

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

-D name

Определите name как макрос с определением 1.

-D name=definition

Содержание definition токенизируется и обрабатывается так, как если бы оно появилось во время третьей фазы трансляции в директиве ‘#define’. В частности, определение усекается вложенными символами новой строки.

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

Если вы хотите определить макрос, подобный функции, в командной строке, запишите его список аргументов со скобками перед знаком равенства (если таковой имеется). Скобки имеют значение для большинства оболочек, поэтому вы должны процитировать опцию. С sh и csh, -D'name(args…)=definition' работает.

Опции -D и -U обрабатываются в порядке их указания в командной строке. Все опции -imacros file и -include file обрабатываются после всех опций -D и -U.

-U name

Отменить любое предыдущее определение name, встроенное или предоставленное с помощью опции -D.

-include file

Обработать file так, как будто #include "file" появилось как первая строка основного исходного файла. Однако первым каталогом, в котором ищется file, является рабочий каталог препроцессора, вместо каталога, содержащего основной исходный файл. Если его не удается найти там, он ищется в остальной части #include "…" цепочки поиска в обычном режиме.

Если задано несколько опций -include, файлы включаются в том порядке, в котором они появляются в командной строке.

-imacros file

Точно так же, как -include, за исключением того, что любой вывод, полученный при сканировании file, отбрасывается. Макросы, которые он определяет, остаются определенными. Это позволяет вам получить все макросы из заголовка без обработки его объявлений.

Все файлы, указанные с помощью -imacros, обрабатываются до всех файлов, указанных с помощью -include.

-undef

Не определять системные или специфичные для GCC макросы. Стандартные предопределенные макросы остаются определенными.

-pthread

Определить дополнительные макросы, необходимые для использования библиотеки POSIX-потоков. Вы должны использовать эту опцию последовательно как для компиляции, так и для компоновки. Эта опция поддерживается на целевых платформах GNU/Linux, большинстве других Unix-производных, а также на целевых платформах x86 Cygwin и MinGW.

-M

Вместо вывода результата предварительной обработки выведите правило, подходящее для make описания зависимостей основного исходного файла. Препроцессор выводит одно make правило, содержащее имя файла объекта для этого исходного файла, двоеточие и имена всех включенных файлов, включая файлы, полученные из опций командной строки -include или -imacros.

Если не указано явно (с помощью -MT или -MQ), имя файла объекта состоит из имени исходного файла с заменой любого суффикса суффиксом файла объекта и удалением любых начальных частей каталога. Если включено много файлов, правило разбивается на несколько строк с использованием ‘\’-новая строка. У правила нет команд.

Эта опция не подавляет вывод отладочной информации препроцессора, например, -dM. Чтобы избежать смешивания такого вывода с правилами зависимостей, необходимо явно указать файл вывода зависимостей с помощью -MF или использовать переменную среды, например, DEPENDENCIES_OUTPUT (см. Переменные среды). Отладочная информация по-прежнему отправляется в стандартный поток вывода, как обычно.

Передача -M драйверу подразумевает -E и подавляет предупреждения с неявным -w.

-MM

Как -M, но не упоминайте файлы заголовков, которые находятся в системных каталогах заголовков, а также файлы заголовков, которые включаются напрямую или косвенно из такого заголовка.

Это означает, что выбор угловых скобок или двойных кавычек в директиве ‘#include’ сам по себе не определяет, появляется ли этот заголовок в выводе зависимостей -MM.

-MF file

При использовании с -M или -MM указывает файл для записи зависимостей. Если переключатель -MF не задан, препроцессор отправляет правила в то же место, куда он отправлял бы вывод предварительной обработки.

При использовании с параметрами драйвера -MD или -MMD -MF переопределяет файл вывода зависимостей по умолчанию.

Если file равно -, то зависимости записываются в stdout.

-MG

В сочетании с опцией, такой как -M, запрашивающей создание зависимостей, -MG предполагает, что отсутствующие файлы заголовков являются генерируемыми файлами и добавляет их в список зависимостей без вывода ошибки. Имя файла зависимостей берется непосредственно из директивы #include без добавления пути. -MG также подавляет вывод предварительной обработки, так как отсутствующий файл заголовка делает его бесполезным.

Эта функция используется в автоматическом обновлении makefiles.

-MP

Эта опция инструктирует CPP добавлять фиктивную цель для каждой зависимости, отличной от основного файла, заставляя каждую зависеть ни от чего. Эти фиктивные правила обходят ошибки, которые make выдаёт, если вы удаляете файлы заголовков без обновления Makefile для соответствия.

Типичный вывод:

test.o: test.c test.h

test.h:
-MT target

Изменить цель правила, выдаваемого генерированием зависимостей. По умолчанию CPP использует имя основного входного файла, удаляет любые компоненты каталога и любые суффиксы файлов, такие как ‘.c’, и добавляет обычный суффикс объекта платформы. Результат является целью.

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

Например, -MT '$(objpfx)foo.o' может дать

$(objpfx)foo.o: foo.c
-MQ target

То же, что и -MT, но она цитирует любые символы, которые являются специальными для Make. -MQ '$(objpfx)foo.o' даёт

$$(objpfx)foo.o: foo.c

Целью по умолчанию автоматически цитируется, как если бы она была задана с помощью -MQ.

-MD

-MD эквивалентно -M -MF file, за исключением того, что -E не подразумевается. Драйвер определяет file в зависимости от того, задана ли опция -o. Если она задана, драйвер использует её аргумент, но с суффиксом .d, в противном случае он использует имя входного файла, удаляет любые компоненты каталога и суффикс, и применяет суффикс .d.

Если -MD используется совместно с -E, любая опция -o понимается как указание файла вывода зависимостей (см. -MF), но если она используется без -E, каждая -o понимается как указание файла объекта цели.

Поскольку -E не подразумевается, -MD может использоваться для генерации файла вывода зависимостей как побочного эффекта процесса компиляции.

-MMD

Как -MD, но упоминает только пользовательские файлы заголовков, а не системные.

-fpreprocessed

Укажите препроцессору, что входной файл уже был обработан предварительно. Это подавляет такие операции, как расширение макросов, преобразование триграфов, склейку новых строк с экранированием и обработку большинства директив. Препроцессор по-прежнему распознает и удаляет комментарии, так что вы можете передать файл, обработанный с помощью -C, компилятору без проблем. В этом режиме интегрированный препроцессор — это в основном токенизатор для фронтовых частей.

-fpreprocessed подразумевается, если входной файл имеет один из расширений ‘.i’, ‘.ii’ или ‘.mi’. Это расширения, которые GCC использует для файлов предварительно обработанного кода, созданных с помощью -save-temps.

-fdirectives-only

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

Поведение опции зависит от опций -E и -fpreprocessed.

С -E предварительная обработка ограничивается обработкой директив, таких как #define, #ifdef, и #error. Другие операции препроцессора, такие как расширение макросов и преобразование триграфов, не выполняются. Кроме того, опция -dD неявно включена.

С -fpreprocessed отключение предварительной подстановки макросов командной строки и большинства встроенных макросов. Макросы, такие как __LINE__, которые зависят от контекста, обрабатываются нормально. Это позволяет компилировать файлы, предварительно обработанные с помощью -E -fdirectives-only.

С -E и -fpreprocessed правила для -fpreprocessed имеют приоритет. Это позволяет полностью обработать файлы, предварительно обработанные с помощью -E -fdirectives-only.

-fdollars-in-identifiers

Принимать ‘$’ в идентификаторах.

-fextended-identifiers

Принимать универсальные имена символов в идентификаторах. Эта опция включена по умолчанию для C99 (и более поздних версий стандарта C) и C++.

-fno-canonical-system-headers

При предварительной обработке не сокращать пути к системным заголовкам с помощью канонизации.

-ftabstop=width

Установить расстояние между отступами. Это помогает препроцессору сообщать корректные номера столбцов в предупреждениях или ошибках, даже если на строке есть табуляции. Если значение меньше 1 или больше 100, опция игнорируется. Значение по умолчанию — 8.

-ftrack-macro-expansion[=level]

Отслеживание расположения токенов при расширении макросов. Это позволяет компилятору выводить диагностические сообщения о текущей стеке расширения макросов при возникновении ошибки компиляции в расширении макроса. Использование этого параметра увеличивает потребление памяти препроцессором и компилятором. Параметр level может использоваться для выбора уровня точности отслеживания расположения токенов, тем самым уменьшая потребление памяти при необходимости. Значение ‘0’ параметра level деактивирует этот параметр. Значение ‘1’ отслеживает расположения токенов в деградированном режиме для минимальной нагрузки на память. В этом режиме все токены, полученные в результате расширения аргумента макроса-функции, имеют одинаковое расположение. Значение ‘2’ полностью отслеживает расположения токенов. Это значение наиболее ресурсоёмкое. При отсутствии параметра значение по умолчанию равно ‘2’.

Обратите внимание, что -ftrack-macro-expansion=2 включено по умолчанию.

-fmacro-prefix-map=old=new

При предварительной обработке файлов, находящихся в каталоге old, расширяются макросы __FILE__ и __BASE_FILE__ так, как если бы файлы находились в каталоге new. Это можно использовать для изменения абсолютного пути на относительный путь, используя . для new, что может привести к более воспроизводимым сборкам, не зависящим от расположения. Этот параметр также влияет на __builtin_FILE() во время компиляции. См. также -ffile-prefix-map.

-fexec-charset=charset

Устанавливает кодировку выполнения, используемую для строковых и символьных констант. По умолчанию используется UTF-8. charset может быть любой кодировкой, поддерживаемой системной библиотекой iconv.

-fwide-exec-charset=charset

Устанавливает широкую кодировку выполнения, используемую для широких строковых и символьных констант. По умолчанию используется UTF-32 или UTF-16, в зависимости от ширины wchar_t. Как и с -fexec-charset, charset может быть любой кодировкой, поддерживаемой системной библиотекой iconv, однако у вас могут возникнуть проблемы с кодировками, которые не точно соответствуют wchar_t.

-finput-charset=charset

Устанавливает кодировку входных данных, используемую для преобразования кодировки входного файла в кодировку исходного текста, используемую GCC. Если локаль не определяет или GCC не может получить эту информацию из локали, по умолчанию используется UTF-8. Это можно переопределить либо с помощью локали, либо с помощью этой команды. В настоящее время команда имеет приоритет при конфликте. charset может быть любой кодировкой, поддерживаемой системной библиотекой iconv.

-fpch-deps

При использовании предварительно скомпилированных заголовков (см. Прекомпилированные заголовки), этот флаг заставляет флаги вывода зависимостей также перечислять файлы из зависимостей предварительно скомпилированного заголовка. Если не указано иное, перечисляются только предварительно скомпилированные заголовки, а не файлы, которые использовались для их создания, потому что при использовании предварительно скомпилированного заголовка эти файлы не используются.

-fpch-preprocess

Этот параметр позволяет использовать предварительно скомпилированный заголовок (см. Прекомпилированные заголовки) вместе с -E. Он вставляет специальный #pragma, #pragma GCC pch_preprocess "filename" в выходной файл, чтобы отметить место, где был найден предварительно скомпилированный заголовок, и его имя файла filename. Когда используется -fpreprocessed, GCC распознает этот #pragma и загружает PCH.

Этот параметр выключен по умолчанию, поскольку полученный препроцессированный вывод подходит только в качестве входных данных для GCC. Он включается с помощью -save-temps.

Вы не должны писать этот #pragma в своём коде, но можете безопасно изменять имя файла, если PCH-файл доступен в другом месте. Имя файла может быть абсолютным или относительным к текущему каталогу GCC.

-fworking-directory

Включает создание маркеров строк в выходных данных препроцессора, которые позволяют компилятору знать текущий рабочий каталог на момент предварительной обработки. При включении этого параметра препроцессор выводит после начального маркера строки второй маркер строки с текущим рабочим каталогом, за которым следуют две косые черты. GCC использует этот каталог, когда он присутствует в входных данных препроцессора, как каталог, выведенный в качестве текущего рабочего каталога в некоторых форматах отладочной информации. Этот параметр подразумевается включённым, если включена отладочная информация, но это может быть отключено с помощью инвертированной формы -fno-working-directory. Если флаг -P присутствует в командной строке, этот параметр не имеет эффекта, так как не генерируются никакие #line директивы.

-A predicate=answer

Выполняет утверждение с предикатом predicate и ответом answer. Эта форма предпочтительнее старой формы -A predicate(answer), которая всё ещё поддерживается, поскольку не использует специальные символы оболочки.

-A -predicate=answer

Отменяет утверждение с предикатом predicate и ответом answer.

-C

Не отбрасывать комментарии. Все комментарии передаются в выходной файл, за исключением комментариев в обработанных директивах, которые удаляются вместе с директивой.

Вы должны быть готовы к побочным эффектам при использовании -C; это заставляет препроцессор обрабатывать комментарии как токены по отдельности. Например, комментарии, появляющиеся в начале строки, которая должна быть директивой, приводят к тому, что эта строка становится обычной исходной строкой, так как первый токен в строке больше не является ‘#’.

-CC

Не отбрасывать комментарии, включая во время расширения макросов. Это аналогично -C, за исключением того, что комментарии, содержащиеся внутри макросов, также передаются в выходной файл, где макрос расширяется.

В дополнение к побочным эффектам параметра -C параметр -CC заставляет все комментарии в стиле C++ внутри макроса преобразовываться в комментарии в стиле C. Это делается для того, чтобы последующее использование этого макроса не привело к непреднамеренному комментированию остальной части строки кода.

Параметр -CC обычно используется для поддержки комментариев lint.

-P

Запретить генерацию маркеров строк в выводе из препроцессора. Это может быть полезно при запуске препроцессора на чём-то, что не является C-кодом, и будет отправлено программе, которая может быть сбита с толку маркерами строк.

-traditional
-traditional-cpp

Попытаться имитировать поведение препроцессоров C до стандарта по сравнению с препроцессорами ISO C. Подробности см. в руководстве по GNU CPP.

Обратите внимание, что GCC не пытается эмулировать компилятор C до стандарта, и эти параметры поддерживаются только с переключателем -E или при явном вызове CPP.

-trigraphs

Поддержка ISO C триграфов. Это трёхсимвольные последовательности, все начинающиеся с ‘??’, которые определены в ISO C как символы. Например, ‘??/’ означает ‘\’, поэтому ‘'??/n'’ — это символьная константа для новой строки.

Девять триграфов и их замены:

Trigraph:       ??(  ??)  ??<  ??>  ??=  ??/  ??'  ??!  ??-
Replacement:      [    ]    {    }    #    \    ^    |    ~

По умолчанию GCC игнорирует триграфы, но в соответствии со стандартом их преобразует. См. параметры -std и -ansi.

-remap

Включение специального кода для обхода файловых систем, которые допускают только очень короткие имена файлов, такие как MS-DOS.

-H

Вывести имя каждого используемого файла заголовка, помимо других обычных действий. Каждое имя отступается, чтобы показать, насколько глубоко оно находится в стеке ‘#include’. Прекомпилированные файлы заголовков также выводятся, даже если они признаны недействительными; недействительный предварительно скомпилированный заголовок выводится с ‘...x’, а действительный — с ‘...!’.

-dletters

Выполнение отладочных дампов во время компиляции, как указано в letters. Флаги, описанные здесь, относятся к препроцессору. Другие letters интерпретируются самим компилятором или зарезервированы для будущих версий GCC и поэтому молча игнорируются. Если вы укажете letters, поведение которых конфликтует, результат не определён. Дополнительную информацию см. в разделе Параметры разработчика.

-dM

Вместо обычного вывода сгенерировать список директив ‘#define’ для всех макросов, определённых во время выполнения препроцессора, включая предопределённые макросы. Это даёт вам возможность узнать, что предопределено в вашей версии препроцессора. Предполагая, что у вас нет файла foo.h, команда

touch foo.h; cpp -dM foo.h

показывает все предопределённые макросы.

Если вы используете -dM без параметра -E, -dM интерпретируется как синоним -fdump-rtl-mach. См. (gcc)Параметры разработчика.

-dD

Аналогично -dM, за исключением двух моментов: он не включает предопределённые макросы, и он выводит и директивы ‘#define’, и результат предварительной обработки. Оба типа вывода идут в стандартный выходной файл.

-dN

Аналогично -dD, но выводит только имена макросов, а не их расширения.

-dI

Выводит директивы ‘#include’ в дополнение к результату предварительной обработки.

-dU

Аналогично -dD, за исключением того, что выводятся только макросы, которые расширяются или чья определённость проверяется в директивах препроцессора; вывод откладывается до использования или проверки макроса; и директивы ‘#undef’ также выводятся для макросов, которые проверялись, но не были определены на момент.

-fdebug-cpp

Этот параметр полезен только для отладки GCC. При использовании из CPP или с -E он выводит отладочную информацию о картах расположения. Каждый токен в выводе предваряется выводом карты, к которой относится его расположение.

При использовании из GCC без -E этот параметр не имеет эффекта.

-Wp,option

Вы можете использовать -Wp,option, чтобы обойти драйвер компилятора и передать option непосредственно препроцессору. Если option содержит запятые, она разделяется на несколько опций в местах запятых. Однако многие опции изменяются, переводятся или интерпретируются драйвером компилятора перед передачей препроцессору, и -Wp принудительно обходит эту фазу. Прямой интерфейс препроцессора не документирован и может меняться, поэтому, по возможности, следует избегать использования -Wp и позволить драйверу обрабатывать опции вместо этого.

-Xpreprocessor option

Передайте option как опцию препроцессору. Вы можете использовать это для предоставления опций препроцессора, специфичных для системы, которые GCC не распознает.

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

-no-integrated-cpp

Выполнить предварительную обработку как отдельный этап перед компиляцией. По умолчанию GCC выполняет предварительную обработку как интегрированную часть токенизации и разбора входных данных. Если эта опция задана, соответствующий языковой фронт-энд (cc1, cc1plus, или cc1obj для C, C++ и Objective-C соответственно) вызывается дважды: один раз только для предварительной обработки и один раз для фактической компиляции преобразованных входных данных. Эта опция может быть полезна в сочетании с опциями -B или -wrapper для указания альтернативного препроцессора или выполнения дополнительной обработки исходного кода программы между обычной предварительной обработкой и компиляцией.

Далее: Опции ассемблера, Предыдущее: Опции инструментирования, Вверх: Вызов GCC [Содержание][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.5.0/gcc/Preprocessor-Options.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API