3.13 Параметры управления препроцессором
Эти параметры управляют C препроцессором, который выполняется над каждым исходным файлом C перед фактической компиляцией.
Если вы используете параметр -E, ничего не делается, кроме предобработки. Некоторые из этих параметров имеют смысл только вместе с -E, поскольку они делают вывод препроцессора непригодным для фактической компиляции.
Помимо параметров, перечисленных здесь, существует ряд параметров для управления поиском путей включения файлов, описанных в Параметрах каталогов. Параметры для управления диагностикой препроцессора перечислены в Параметрах предупреждений.
-D name-
Предварительно определить имя как макрос, с определением
1. -D name=definition-
Содержимое определения токенизируется и обрабатывается так, как если бы оно появилось во время фазы трансляции три в директиве ‘#define’. В частности, определение усекается встроенными символами новой строки.
Если вы вызываете препроцессор из оболочки или оболочеподобной программы, вам может потребоваться использовать синтаксис цитирования оболочки для защиты символов, таких как пробелы, которые имеют значение в синтаксисе оболочки.
Если вы хотите определить макрос типа функции в командной строке, запишите его список аргументов с окружающими скобками перед знаком равенства (если он есть). Скобки имеют значение для большинства оболочек, поэтому вы должны процитировать опцию. С
shиcsh, -D'имя(аргументы…)=определение' работает.Опции -D и -U обрабатываются в порядке их указания в командной строке. Все опции -imacros файл и -include файл обрабатываются после всех опций -D и -U.
-U name-
Отменить любое предыдущее определение имени, встроенное или предоставленное с помощью опции -D.
-include file-
Обработать файл так, как если бы
#include "file"появилось в качестве первой строки основного исходного файла. Однако, первый каталог, в котором ищется файл, — это рабочий каталог препроцессора, вместо каталога, содержащего основной исходный файл. Если его там нет, он ищется в оставшейся части#include "…"цепочки поиска как обычно.Если указано несколько опций -include, файлы включаются в том порядке, в котором они появляются в командной строке.
-imacros file-
Точно так же, как -include, за исключением того, что любой выходной сигнал, полученный при сканировании файл, отбрасывается. Макросы, которые он определяет, остаются определенными. Это позволяет получить все макросы из заголовка без обработки его объявлений.
Все файлы, указанные с помощью -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 переопределяет файл вывода зависимостей по умолчанию.
Если файл равен -, тогда зависимости записываются в stdout.
-MG-
В сочетании с такой опцией, как -M, запрашивающей создание зависимостей, -MG предполагает, что отсутствующие файлы заголовков являются генерируемыми файлами и добавляет их в список зависимостей без повышения ошибки. Имя файла зависимостей берётся непосредственно из директивы
#includeбез добавления пути. -MG также подавляет вывод предварительной обработки, так как отсутствующий файл заголовка делает это бесполезным.Эта функция используется в автоматическом обновлении makefiles.
-Mno-modules-
Отключить создание зависимостей для интерфейсов скомпилированных модулей.
-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 файл, за исключением того, что -E не подразумевается. Драйвер определяет файл на основе того, задана ли опция -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-
При предварительной обработке не сокращать пути к системным файлам заголовков с помощью канонизации.
-fmax-include-depth=depth-
Установить максимальную глубину вложенных #include. Значение по умолчанию — 200.
-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 для указания альтернативного препроцессора или выполнения дополнительной обработки исходного кода программы между обычной предварительной обработкой и компиляцией. -flarge-source-files-
Настройте GCC для ожидания больших исходных файлов, за счёт замедления компиляции и увеличения использования памяти.
В частности, GCC обычно отслеживает номера столбцов и строк в исходных файлах, и обычно печатает оба этих номера в диагностических сообщениях. Однако, после обработки определенного количества строк исходного кода, он прекращает отслеживание номеров столбцов и отслеживает только номера строк. Это означает, что диагностические сообщения для последующих строк не включают номера столбцов. Это также означает, что такие опции, как -Wmisleading-indentation, перестают работать в этот момент, хотя компилятор печатает заметку, если это произойдёт. Передача -flarge-source-files значительно увеличивает количество строк исходного кода, которые GCC может обработать, прежде чем он перестанет отслеживать столбцы.
Далее: Опции Ассемблера, Предыдущее: Опции Инструментирования, Вверх: Вызов GCC [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Preprocessor-Options.html