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