3.11 Параметры, управляющие препроцессором
Эти параметры управляют C-препроцессором, который выполняется для каждого исходного файла C перед фактической компиляцией.
Если вы используете параметр -E, то ничего не происходит, кроме предварительной обработки. Некоторые из этих параметров имеют смысл только вместе с -E, потому что они делают вывод препроцессора непригодным для фактической компиляции.
-
-Wp,option - Вы можете использовать -Wp,option, чтобы обойти драйвер компилятора и передать option непосредственно препроцессору. Если option содержит запятые, она разбивается на несколько параметров в местах запятых. Однако многие параметры изменяются, переводятся или интерпретируются драйвером компилятора перед передачей препроцессору, и
-Wpнасильно обходит эту фазу. Прямой интерфейс препроцессора не документирован и может изменяться, поэтому, по возможности, следует избегать использования-Wpи позволять драйверу обрабатывать параметры вместо этого. -
-Xpreprocessoroption - Передать option в качестве параметра препроцессору. Вы можете использовать это для передачи специфичных для системы параметров препроцессора, которые GCC не распознает.
Если вы хотите передать параметр, принимающий аргумент, вы должны использовать
-Xpreprocessorдважды, один раз для параметра и один раз для аргумента. -no-integrated-cpp- Выполнять предварительную обработку как отдельный этап перед компиляцией. По умолчанию GCC выполняет предварительную обработку как интегрированную часть токенизации и разбора входных данных. Если этот параметр задан, соответствующий фронтенд языка (
cc1,cc1plus, илиcc1objдля C, C++ и Objective-C соответственно) вызывается дважды: один раз для только предварительной обработки и один раз для фактической компиляции обработанных входных данных. Этот параметр может быть полезен в сочетании с параметрами-Bили-wrapperдля указания альтернативного препроцессора или выполнения дополнительной обработки исходного кода между обычной предварительной обработкой и компиляцией.
-
-Dname - Предопределить name в качестве макроса с определением
1. -
-Dname=definition - Содержимое definition токенизируется и обрабатывается так, как если бы оно появилось во время третьей фазы трансляции в директиве ‘
#define’. В частности, определение будет усечено вложенными символами новой строки.Если вы вызываете препроцессор из оболочки или подобной программы, вам может потребоваться использовать синтаксис цитирования оболочки для защиты символов, таких как пробелы, которые имеют значение в синтаксисе оболочки.
Если вы хотите определить макрос, похожий на функцию, в командной строке, запишите его список аргументов в скобки перед знаком равенства (если таковой имеется). Скобки имеют смысл для большинства оболочек, поэтому вам нужно будет процитировать опцию. С помощью
shиcsh, -D'name(args...)=definition' работает.Опции
-Dи-Uобрабатываются в порядке их указания в командной строке. Все опции -imacros file и -include file обрабатываются после всех опций-Dи-U. -
-Uname - Отменить любое предыдущее определение name, встроенное или предоставленное с помощью опции
-D. -undef- Не определять какие-либо системно-специфичные или GCC-специфичные макросы. Стандартные предопределённые макросы остаются определёнными.
-
-Idir - Добавить каталог dir в список каталогов, которые нужно искать для заголовочных файлов. Каталоги, указанные с помощью
-I, ищутся перед стандартными системными каталогами включения. Если каталог dir является стандартным системным каталогом включения, эта опция игнорируется, чтобы убедиться, что порядок поиска по умолчанию для системных каталогов и специальное обращение с системными заголовками не нарушаются. Если dir начинается с=, то=будет заменено префиксом sysroot; см.--sysrootи-isysroot. -
-ofile - Записать вывод в file. Это то же самое, что и указание file как второго не являющегося опцией аргумента для
cpp.gccимеет другое толкование второго не являющегося опцией аргумента, поэтому вы должны использовать-oдля указания выходного файла. -Wall- Включает все необязательные предупреждения, желательные для обычного кода. В настоящее время это
-Wcomment,-Wtrigraphs,-Wmulticharи предупреждение о том, что продвижение целых чисел вызывает изменение знака в выражениях#if. Обратите внимание, что многие предупреждения препроцессора включены по умолчанию и не имеют опций для их управления. -
-Wcomment-Wcomments - Выдавать предупреждение всякий раз, когда последовательность начала комментария ‘
/*’ появляется в комментарии ‘/*’, или когда обратный слеш-новая строка появляется в комментарии ‘//’. (Оба варианта имеют одинаковый эффект). -Wtrigraphs- Большинство триграфов в комментариях не могут повлиять на смысл программы. Однако триграф, который сформирует экранированную новую строку (‘
??/’ в конце строки), может изменить начало или конец комментария. Поэтому предупреждения выдаются только для триграфов, которые сформируют экранированные новые строки внутри комментария.Эта опция подразумевается опцией
-Wall. Если-Wallне указана, эта опция всё равно включена, если триграфы не включены. Чтобы получить преобразование триграфов без предупреждений, но получить другие предупреждения-Wall, используйте ‘-trigraphs -Wall -Wno-trigraphs’. -Wtraditional- Предупреждать о некоторых конструкциях, которые ведут себя по-разному в традиционном и ISO C. Также предупреждать о конструкциях ISO C, не имеющих эквивалентов в традиционном C, и проблематичных конструкциях, которых следует избегать.
-Wundef- Предупреждать всякий раз, когда встречается идентификатор, который не является макросом, в директиве ‘
#if’, вне ‘defined’. Такие идентификаторы заменяются нулём. -Wunused-macros- Предупреждать о макросах, определённых в основном файле, которые не используются. Макрос считается используемым, если он раскрыт или проверен на существование хотя бы один раз. Препроцессор также будет предупреждать, если макрос не был использован во время его переопределения или удаления.
Встроенные макросы, макросы, определённые в командной строке, и макросы, определённые в файлах включения, не будут предупреждать.
Примечание: Если макрос фактически используется, но только в пропущенных условных блоках, то CPP сообщит об этом как об unused. Чтобы избежать предупреждения в таком случае, можно улучшить область определения макроса, например, поместив его в первый пропущенный блок. В качестве альтернативы вы можете предоставить фиктивное использование, используя что-то вроде:
#if defined the_macro_causing_the_warning #endif
-Wendif-labels- Предупреждать всякий раз, когда ‘
#else’ или ‘#endif’ следуют за текстом. Это обычно происходит в коде вида#if FOO ... #else FOO ... #endif FOO
Вторые и третьи
FOOдолжны быть комментариями, но часто ими не являются в более старых программах. Это предупреждение включено по умолчанию. -Werror- Преобразовать все предупреждения в жёсткие ошибки. Исходный код, который вызывает предупреждения, будет отклонен.
-Wsystem-headers- Выдавать предупреждения для кода в системных заголовках. Они обычно бесполезны при поиске ошибок в вашем собственном коде, поэтому подавляются. Если вы отвечаете за системную библиотеку, вам может быть интересно их увидеть.
-w- Подавить все предупреждения, включая те, которые GNU CPP выдает по умолчанию.
-pedantic- Выдавать все обязательные диагностические сообщения, перечисленные в стандарте C. Некоторые из них по умолчанию опущены, так как они часто срабатывают на безобидном коде.
-pedantic-errors- Выдать все обязательные диагностические сообщения и преобразовать все обязательные диагностические сообщения в ошибки. Это включает обязательные диагностические сообщения, которые GCC выдаёт без ‘
-pedantic’, но обрабатывает как предупреждения. -M- Вместо вывода результата предварительной обработки, вывести правило, подходящее для
make, описывающее зависимости основного исходного файла. Препроцессор выводит одноmakeправило, содержащее имя файла объекта для этого исходного файла, двоеточие и имена всех включённых файлов, включая те, которые поступают из опций командной строки-includeили-imacros.Если не указано явно (с помощью
-MTили-MQ), имя файла объекта состоит из имени исходного файла с заменой любых суффиксов на суффикс файла объекта и удалением любых начальных компонентов каталога. Если включено много файлов, то правило разбивается на несколько строк с помощью ‘\’-новая строка. Правило не содержит команд.Эта опция не подавляет вывод отладочной информации препроцессора, например
-dM. Чтобы избежать смешивания такого вывода отладки с правилами зависимостей, необходимо явно указать файл вывода зависимостей с помощью-MF, или использовать переменную среды, например,DEPENDENCIES_OUTPUT(см. Переменные среды). Вывод отладки всё равно будет отправлен в стандартный поток вывода как обычно.Передача
-Mдрайверу подразумевает-E, и подавляет предупреждения с неявным-w. -MM- Подобно
-M, но не упоминает заголовочные файлы, которые находятся в системных каталогах заголовков, а также заголовочные файлы, которые включаются, непосредственно или косвенно, из такого заголовка.Это означает, что выбор угловых скобок или двойных кавычек в директиве ‘
#include’ сам по себе не определяет, будет ли этот заголовок отображаться в выводе зависимостей-MM. Это небольшое изменение семантики по сравнению с версиями GCC 3.0 и более ранними. -
-MFfile - При использовании с
-Mили-MM, указывает файл для записи зависимостей. Если не указан переключатель-MF, препроцессор отправляет правила в то же место, куда он отправил бы обработанный вывод.При использовании с опциями драйвера
-MDили-MMD,-MFпереопределяет файл вывода зависимостей по умолчанию. -MG- В сочетании с такой опцией, как
-M, запрашивающая создание зависимостей,-MGпредполагает, что отсутствующие заголовочные файлы являются генерируемыми файлами и добавляет их в список зависимостей без вывода ошибки. Имя файла зависимостей берется непосредственно из директивы#includeбез добавления пути.-MGтакже подавляет вывод обработанного текста, так как отсутствующий заголовочный файл делает это бесполезным.Эта функция используется в автоматическом обновлении make файлов.
-MP- Эта опция инструктирует CPP добавить фиктивную цель для каждой зависимости, кроме основного файла, заставляя каждую зависеть от ничего. Эти фиктивные правила обходят ошибки, которые
makeдаёт, если вы удаляете заголовочные файлы без обновленияMakefile, чтобы они соответствовали.Это типичный вывод:
test.o: test.c test.h test.h:
-
-MTtarget - Изменить цель правила, генерируемого созданием зависимостей. По умолчанию CPP берёт имя основного входного файла, удаляет все компоненты каталога и любой суффикс файла, например ‘
.c’, и добавляет обычный суффикс объекта платформы. Результат — цель.Опция
-MTустановит целевой объект на точно указанную вами строку. Если вам нужны несколько целей, вы можете указать их как один аргумент к-MT, или использовать несколько опций-MT.Например,
-MT '$(objpfx)foo.o'может дать$(objpfx)foo.o: foo.c
-
-MQtarget - То же, что и
-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, за исключением того, что упоминаются только пользовательские заголовочные файлы, а не системные. -fpch-deps- При использовании предварительно скомпилированных заголовков (см. Предварительно скомпилированные заголовки), этот флаг заставит флаги вывода зависимостей также перечислить файлы из зависимостей предварительно скомпилированного заголовка. Если не указано иначе, будет перечислен только предварительно скомпилированный заголовок, а не файлы, которые были использованы для его создания, поскольку эти файлы не используются при использовании предварительно скомпилированного заголовка.
-fpch-preprocess- Этот параметр позволяет использовать предварительно скомпилированный заголовок (см. Предварительно скомпилированные заголовки) вместе с
-E. Он вставляет специальный#pragma,#pragma GCC pch_preprocess "имя_файла"в выходные данные, чтобы отметить место, где был найден предварительно скомпилированный заголовок, и его имя_файла. Когда-fpreprocessedиспользуется, GCC распознает этот#pragmaи загружает PCH.Этот параметр отключен по умолчанию, потому что полученные данные предварительной обработки подходят только в качестве входных данных для GCC. Он включается параметром
-save-temps.Вы не должны писать этот
#pragmaв своем собственном коде, но безопасно изменить имя файла, если файл PCH доступен в другом месте. Имя файла может быть абсолютным или относительным к текущему каталогу GCC. -
-x c-x c++-x objective-c-x assembler-with-cpp - Укажите язык исходного кода: C, C++, Objective-C или ассемблер. Это не имеет отношения к соответствию стандартам или расширениям; это просто выбор базового синтаксиса, который следует ожидать. Если вы не укажете ни один из этих параметров, cpp определит язык по расширению исходного файла: ‘
.c’, ‘.cc’, ‘.m’ или ‘.S’. Также распознаются некоторые другие распространённые расширения для C++ и ассемблера. Если cpp не распознаёт расширение, он обработает файл как C; это наиболее общий режим.Примечание: Предыдущие версии cpp принимали параметр
-lang, который выбирал как язык, так и уровень соответствия стандартам. Этот параметр был удалён, потому что он конфликтует с параметром-l. -
-std=стандарт-ansi - Укажите стандарт, которому должен соответствовать код. В настоящее время CPP знает о стандартах C и C++; в будущем могут быть добавлены другие.
стандарт может быть одним из:
-
c90c89iso9899:1990 - Стандарт ISO C 1990 года. ‘
c90’ — это обычное сокращение для этой версии стандарта.Параметр
-ansiэквивалентен-std=c90. iso9899:199409- Стандарт C ISO 1990 года, изменённый в 1994 году.
-
iso9899:1999c99iso9899:199xc9x - Пересмотренный стандарт ISO C, опубликованный в декабре 1999 года. До публикации он был известен как C9X.
-
iso9899:2011c11c1x - Пересмотренный стандарт ISO C, опубликованный в декабре 2011 года. До публикации он был известен как C1X.
-
gnu90gnu89 - Стандарт C ISO 1990 года плюс расширения GNU. Это значение по умолчанию.
-
gnu99gnu9x - Стандарт C ISO 1999 года плюс расширения GNU.
-
gnu11gnu1x - Стандарт C ISO 2011 года плюс расширения GNU.
c++98- Стандарт ISO C++ 1998 года плюс поправки.
gnu++98- То же, что и
-std=c++98плюс расширения GNU. Это значение по умолчанию для кода C++.
-
-I-- Разделить путь включения. Любые каталоги, указанные с параметрами
-Iперед-I-, будут проверяться только на заголовки, запрошенные с#include "файл"; они не будут проверяться на#include <файл>. Если дополнительные каталоги указаны с параметрами-Iпосле-I-, эти каталоги будут проверяться на все директивы ‘#include’.Кроме того,
-I-запрещает использование каталога текущего файла в качестве первого каталога поиска для#include "файл". Этот параметр устарел. -nostdinc- Не проверять стандартные системные каталоги на заголовочные файлы. Будут проверяться только каталоги, указанные вами с параметрами
-I(и каталог текущего файла, если это необходимо). -nostdinc++- Не проверять каталоги стандартных заголовков, специфичные для C++, но всё ещё проверять другие стандартные каталоги. (Этот параметр используется при построении библиотеки C++.)
-
-includeфайл - Обработать файл так, как будто
#include "file"появился в качестве первой строки основного исходного файла. Однако первым каталогом, проверяемым на файл, является рабочий каталог препроцессора вместо каталога, содержащего основной исходный файл. Если он не найден там, он проверяется в оставшейся части цепочки поиска#include "..."в обычном порядке.Если задано несколько параметров
-include, файлы включаются в том порядке, в котором они появляются в командной строке. -
-imacrosфайл - Точно так же, как
-include, за исключением того, что любые данные, полученные в результате сканирования файл, отбрасываются. Макросы, которые он определяет, остаются определёнными. Это позволяет вам получить все макросы из заголовка, не обрабатывая также его объявления.Все файлы, указанные параметром
-imacros, обрабатываются до всех файлов, указанных параметром-include. -
-idirafterкаталог - Проверить каталог на заголовочные файлы, но сделать это после того, как будут проверены все каталоги, указанные параметром
-I, и стандартные системные каталоги. каталог обрабатывается как системный каталог включения. Если каталог начинается с=, то=будет заменён префиксом sysroot; см.--sysrootи-isysroot. -
-iprefixпрефикс - Укажите префикс в качестве префикса для последующих
-iwithprefixпараметров. Если префикс представляет собой каталог, вы должны включить конечный ‘/’. -
-iwithprefixкаталог-iwithprefixbeforeкаталог - Добавить каталог к префиксу, указанному ранее с
-iprefix, и добавить полученный каталог в путь поиска заголовков.-iwithprefixbeforeпомещает его в то же место, что и-I;-iwithprefixпомещает его туда, где будет-idirafter. -
-isysrootкаталог - Этот параметр похож на параметр
--sysroot, но применяется только к заголовочным файлам (за исключением целей Darwin, где он применяется к заголовочным файлам и библиотекам). Более подробную информацию см. в параметре--sysroot. -
-imultilibкаталог - Использовать каталог как подкаталог каталога, содержащего заголовочные файлы C++ для конкретной целевой платформы.
-
-isystemкаталог - Проверить каталог на заголовочные файлы после всех каталогов, указанных параметром
-I, но перед стандартными системными каталогами. Отметить его как системный каталог, чтобы он получил такое же специальное обращение, как и стандартные системные каталоги. Если каталог начинается с=, то=будет заменён префиксом sysroot; см.--sysrootи-isysroot. -
-iquoteкаталог - Проверить каталог только на заголовочные файлы, запрошенные с
#include "файл"; они не проверяются на#include <файл>, до всех каталогов, указанных параметром-I, и до стандартных системных каталогов. Если каталог начинается с=, то=будет заменён префиксом sysroot; см.--sysrootи-isysroot. -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- Принимать универсальные имена символов в идентификаторах. Этот параметр экспериментальный; в будущей версии GCC он будет включён по умолчанию для C99 и C++.
-fno-canonical-system-headers- При предварительной обработке не сокращать пути к системным заголовкам с помощью канонизации.
-fpreprocessed- Указать препроцессору, что входной файл уже был предварительно обработан. Это подавляет такие действия, как расширение макросов, преобразование триграфов, слияние экранированных символов новой строки и обработку большинства директив. Препроцессор всё ещё распознаёт и удаляет комментарии, поэтому вы можете передать файл, предварительно обработанный с
-Cкомпилятору без проблем. В этом режиме интегрированный препроцессор представляет собой не более чем токенизатор для передних концов. -fpreprocessedподразумевается, если входной файл имеет одно из расширений «.i», «.ii» или «.mi». Это расширения, которые GCC использует для предварительно обработанных файлов, созданных-save-temps.-
-ftabstop=width - Установить расстояние между табуляциями. Это помогает препроцессору сообщать правильные номера столбцов в предупреждениях или ошибках, даже если на строке встречаются табуляции. Если значение меньше 1 или больше 100, параметр игнорируется. Значение по умолчанию — 8.
-fdebug-cpp- Этот параметр полезен только для отладки GCC. При использовании с
-E, выводит отладочную информацию о картах расположения. Каждый токен в выводе предваряется выводом карты, к которой принадлежит его расположение. Вывод карты, содержащей расположение токена, будет следующим:{‘P’:/file/path;‘F’:/includer/path;‘L’:line_num;‘C’:col_num;‘S’:system_header_p;‘M’:map_address;‘E’:macro_expansion_p,‘loc’:location}При использовании без
-E, этот параметр не оказывает никакого влияния. -
-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. -fworking-directory- Включить генерацию маркеров строк в выводе препроцессора, которые позволят компилятору узнать текущую рабочую директорию во время предварительной обработки. При включенном этом параметре препроцессор выведет после начального маркера строки второй маркер с текущей рабочей директорией, за которым следуют две косые черты. GCC будет использовать эту директорию, если она присутствует во входных данных предварительно обработанного файла, как директорию, указанную в качестве текущей рабочей директории в некоторых форматах отладочной информации. Этот параметр неявно включен, если включена отладочная информация, но это можно запретить с помощью инверсной формы
-fno-working-directory. Если флаг-Pприсутствует в командной строке, этот параметр не оказывает никакого влияния, так как никакие директивы#lineне выводятся. -fno-show-column- Не печатать номера столбцов в диагностических сообщениях. Это может быть необходимо, если диагностические сообщения сканируются программой, не понимающей номера столбцов, например,
dejagnu. -
-Apredicate=answer - Выполнить утверждение с предикатом predicate и ответом answer. Эта форма предпочтительнее старой формы -A predicate(answer), которая всё ещё поддерживается, потому что она не использует специальные символы оболочки.
-
-A -predicate=answer - Отменить утверждение с предикатом predicate и ответом answer.
-dCHARS-
CHARS — это последовательность одного или более из следующих символов, и она не должна предваряться пробелом. Другие символы интерпретируются самим компилятором или зарезервированы для будущих версий GCC, поэтому они игнорируются. Если вы укажете символы, поведение которых конфликтует, результат не определён.
- ‘
M’ - Вместо обычного вывода сгенерировать список директив «
#define» для всех макросов, определённых во время выполнения препроцессора, включая предопределённые макросы. Это даёт вам способ узнать, что предопределено в вашей версии препроцессора. Предполагая, что у вас нет файлаfoo.h, командаtouch foo.h; cpp -dM foo.h
покажет все предопределённые макросы. Если вы используете
-dMбез параметра-E,-dMинтерпретируется как синоним для-fdump-rtl-mach. См. Параметры отладки.- ‘
D’ - Подобно ‘
M’, за исключением двух аспектов: он не включает предопределённые макросы и выводит и директивы ‘#define’, и результат предварительной обработки. Оба вида вывода направляются в стандартный выходной файл. - ‘
N’ - Подобно ‘
D’, но выводить только имена макросов, а не их расширения. - ‘
I’ - Вывести директивы ‘
#include’ в дополнение к результату предварительной обработки. - ‘
U’ - Подобно ‘
D’, за исключением того, что выводятся только макросы, которые расширены или чьё определение проверяется в директивах препроцессора; вывод откладывается до использования или проверки макроса; и директивы «#undef» также выводятся для макросов, проверенных, но не определённых в момент времени.
- ‘
-P- Запретить генерацию маркеров строк в выводе препроцессора. Это может быть полезно при выполнении препроцессора на чём-то, что не является кодом C, и что будет отправлено программе, которая может быть сбита с толку маркерами строк.
-C- Не отбрасывать комментарии. Все комментарии передаются в выходной файл, за исключением комментариев в обработанных директивах, которые удаляются вместе с директивой.
Вы должны быть готовы к побочным эффектам при использовании
-C; это заставляет препроцессор обрабатывать комментарии как токены сами по себе. Например, комментарии в начале строки, которая должна быть директивой, имеют эффект превращения этой строки в обычную строку исходного кода, так как первый токен в строке больше не является ‘#’.-CC- Не отбрасывать комментарии, включая при расширении макросов. Это как
-C, за исключением того, что комментарии, содержащиеся внутри макросов, также передаются в выходной файл при расширении макроса. В дополнение к побочным эффектам параметра
-C, параметр-CCприводит к преобразованию всех комментариев в стиле C++ внутри макроса в комментарии в стиле C. Это для предотвращения случайного комментирования остальной части строки исходного кода при последующем использовании этого макроса.Параметр
-CCобычно используется для поддержки комментариев lint.-traditional-cpp- Попытаться имитировать поведение старых препроцессоров C по сравнению с препроцессорами ISO C.
-trigraphs- Обрабатывать триграфные последовательности. Это последовательности из трёх символов, все начинающиеся с ‘
??’, которые определены ISO C как заменяющие одиночные символы. Например, ‘??’ обозначает ‘\’, поэтому ‘'??/n'’ — это символьная константа новой строки. По умолчанию GCC игнорирует триграфы, но в соответствии со стандартом их преобразует. См. параметры-stdи-ansi. Девять триграфов и их замены:
Trigraph: ??( ??) ??< ??> ??= ??/ ??' ??! ??- Replacement: [ ] { } # \ ^ | ~-remap- Включить специальный код для обхода файловых систем, которые допускают только очень короткие имена файлов, такие как MS-DOS.
-
--help--target-help - Вывести текст, описывающий все параметры командной строки, а не выполнять предварительную обработку.
-v- Режим подробной информации. Вывести номер версии GNU CPP в начале выполнения и сообщить о конечном виде пути включения.
-H- Вывести имя каждого используемого заголовочного файла, помимо других обычных действий. Каждое имя отстунено, чтобы показать глубину вложенности в стеке «
#include». Предварительно скомпилированные заголовочные файлы также выводятся, даже если они оказались недействительными; недействительный предварительно скомпилированный заголовочный файл выводится с «...x», а действительный — с «...!» . -
-version--version
- Вывести номер версии GNU CPP. С одним дефисом, продолжить предобработку в обычном режиме. С двумя дефисами, немедленно завершить работу.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/Preprocessor-Options.html