3.12 Параметры управления препроцессором
Эти параметры управляют C препроцессором, который выполняется над каждым исходным файлом C перед фактической компиляцией.
Если вы используете параметр -E, ничего не делается, кроме предобработки. Некоторые из этих параметров имеют смысл только вместе с -E, так как они приводят к тому, что вывод препроцессора непригоден для фактической компиляции.
Помимо перечисленных здесь параметров, есть ряд параметров для управления поиском включаемых файлов, описанных в Параметрах каталогов. Параметры для управления диагностикой препроцессора перечислены в Параметрах предупреждений.
-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 переопределяет файл вывода зависимостей по умолчанию.
-MG-
В сочетании с опцией, такой как -M, запрашивающей генерацию зависимостей, -MG предполагает, что отсутствующие файлы заголовков являются файлами, созданными при генерации зависимостей, и добавляет их в список зависимостей без повышения ошибки. Имя файла зависимостей берется непосредственно из директивы
#includeбез добавления пути. -MG также подавляет предварительно обработанный вывод, так как отсутствующий файл заголовка делает его бесполезным.Эта функция используется в автоматическом обновлении файлов make.
-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активировано по умолчанию.
-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-7.5.0/gcc/Preprocessor-Options.html