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 также подавляет вывод результата предварительной обработки, так как отсутствующий файл заголовка делает его бесполезным.Эта функция используется в автоматическом обновлении файлов makefile.
-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-8.5.0/gcc/Preprocessor-Options.html