3.12 Параметры, управляющие препроцессором
Эти параметры управляют C препроцессором, который запускается для каждого исходного файла C перед непосредственной компиляцией.
Если вы используете опцию -E, то ничего не делается, кроме предварительной обработки. Некоторые из этих параметров имеют смысл только вместе с -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 для указания альтернативного препроцессора или выполнения дополнительной обработки исходного кода программы между обычной предварительной обработкой и компиляцией.
-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.
-undef-
Не следует предварительно определять какие-либо системные или специфичные для GCC макросы. Стандартные предварительно определенные макросы остаются определенными.
-I dir-
Добавить директорию dir в список директорий, которые будут просматриваться при поиске заголовочных файлов. Директории, заданные с помощью -I, просматриваются перед стандартными системными директориями заголовочных файлов. Если директория dir является стандартной системной директорий заголовочных файлов, опция игнорируется для обеспечения того, что порядок поиска системных директорий по умолчанию и специальное обращение с системными заголовками не нарушаются. Если dir начинается с
=, то=будет заменено префиксом sysroot; см. --sysroot и -isysroot. -o file-
Записать выходной файл в 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), имя файла объекта состоит из имени исходного файла с заменой любого суффикса на суффикс файла объекта и удалением любых ведущих частей каталога. Если включено много файлов, то правило разбивается на несколько строк с помощью ‘\’-newline. Правило не содержит команд.
Эта опция не подавляет вывод отладки препроцессора, например -dM. Чтобы избежать смешивания такого вывода отладки с правилами зависимостей, следует явно указать файл вывода зависимостей с помощью -MF или использовать переменную окружения, такую как
DEPENDENCIES_OUTPUT(см. Переменные окружения). Вывод отладки по-прежнему будет отправлен в обычный поток вывода, как обычно.Передача -M драйверу подразумевает -E и подавляет предупреждения с помощью неявного -w.
-MM-
Как -M, но не упоминать заголовочные файлы, которые находятся в системных директориях заголовочных файлов, а также заголовочные файлы, включенные непосредственно или косвенно из такого заголовка.
Это означает, что выбор угловых скобок или двойных кавычек в директиве «#include» сам по себе не определяет, будет ли этот заголовок отображаться в выводе зависимостей -MM. Это небольшое изменение семантики по сравнению с версиями GCC 3.0 и более ранними.
-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, за исключением того, что упоминаются только пользовательские заголовочные файлы, а не системные.
-fpch-deps-
При использовании предварительно скомпилированных заголовков (см. Предварительно скомпилированные заголовки), этот флаг заставит флаги вывода зависимостей также перечислить файлы из зависимостей предварительно скомпилированного заголовка. Если не указано, будет перечислен только предварительно скомпилированный заголовок, а не файлы, используемые для его создания, поскольку эти файлы не учитываются при использовании предварительно скомпилированного заголовка.
-fpch-preprocess-
Эта опция позволяет использовать предварительно скомпилированный заголовок (см. Предварительно скомпилированные заголовки) вместе с -E. Она вставляет специальный
#pragma,#pragma GCC pch_preprocess "filename"в выходные данные, чтобы отметить место, где был найден предварительно скомпилированный заголовок, и его имя файла filename. При использовании -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=standard-ansi-
Укажите стандарт, которому должен соответствовать код. В настоящее время CPP знает о стандартах C и C++; в будущем могут быть добавлены другие.
standard может быть одним из следующих:
c90c89iso9899:1990-
Стандарт ISO C от 1990 года. ‘c90’ — это обычное сокращение для этой версии стандарта.
Опция -ansi эквивалентна -std=c90.
iso9899:199409-
Стандарт C 1990 года с поправками 1994 года.
iso9899:1999c99iso9899:199xc9x-
Пересмотренный стандарт ISO C, опубликованный в декабре 1999 года. До публикации он был известен как C9X.
iso9899:2011c11c1x-
Пересмотренный стандарт ISO C, опубликованный в декабре 2011 года. До публикации он был известен как C1X.
gnu90gnu89-
Стандарт C 1990 года плюс расширения GNU. Это значение по умолчанию.
gnu99gnu9x-
Стандарт C 1999 года плюс расширения GNU.
gnu11gnu1x-
Стандарт C 2011 года плюс расширения GNU.
c++98-
Стандарт ISO C++ 1998 года плюс поправки.
gnu++98То же самое, что -std=c++98 плюс расширения GNU. Это значение по умолчанию для кода C++.
-I--
Разделить путь включения. Все директории, указанные с опциями -I перед -I-, просматриваются только для заголовков, запрошенных с
#include "file"; они не просматриваются для#include <file>. Если дополнительные директории указаны с опциями -I после -I-, эти директории просматриваются для всех директив ‘#include’.Кроме того, -I- запрещает использование директории текущего файла как первой директории поиска для
#include "file". Эта опция устарела. -nostdinc-
Не просматривать стандартные системные директории для заголовочных файлов. Просматриваются только директории, указанные вами с опциями -I (и директория текущего файла, если применимо).
-nostdinc++-
Не просматривать C++-специфические стандартные директории для заголовочных файлов, но все же просматривать другие стандартные директории. (Эта опция используется при построении библиотеки C++.)
-include file-
Обработать file так, как если бы
#include "file"появилось в первой строке основного исходного файла. Однако первой директорией, просматриваемой для file, является рабочая директория препроцессора вместо директории, содержащей основной исходный файл. Если файл не найден там, он просматривается в остальной части#include "…"цепочки поиска в обычном режиме.Если задано несколько опций -include, файлы включаются в порядке их появления в командной строке.
-imacros file-
Точно так же, как -include, за исключением того, что все выходные данные, полученные при сканировании file, отбрасываются. Макросы, которые он определяет, остаются определёнными. Это позволяет получить все макросы из заголовка без обработки его объявлений.
Все файлы, указанные с помощью -imacros, обрабатываются до всех файлов, указанных с помощью -include.
-idirafter dir-
Просмотреть dir на наличие заголовочных файлов, но выполнить это после всех директорий, указанных с -I, и стандартных системных директорий. dir обрабатывается как системная директория включения. Если dir начинается с
=, то=будет заменено префиксом sysroot; см. --sysroot и -isysroot. -iprefix prefix-
Указать prefix в качестве префикса для последующих опций -iwithprefix. Если префикс представляет собой директорию, вы должны включить заключительный символ ‘/’.
-iwithprefix dir-iwithprefixbefore dir-
Добавить dir к префиксу, указанному ранее с -iprefix, и добавить полученную директорию в путь поиска заголовков. -iwithprefixbefore помещает его в то же место, что и -I; -iwithprefix помещает его туда же, что и -idirafter.
-isysroot dir-
Эта опция похожа на опцию --sysroot, но применяется только к заголовочным файлам (кроме целей Darwin, где она применяется к заголовочным файлам и библиотекам). Подробнее см. опцию --sysroot.
-imultilib dir-
Использовать dir как поддиректорию директории, содержащей целевые C++ заголовочные файлы.
-isystem dir-
Просмотреть dir на наличие заголовочных файлов после всех директорий, указанных с -I, но перед стандартными системными директориями. Отметить его как системную директорию, чтобы он получил такое же специальное обращение, как и стандартные системные директории. Если dir начинается с
=, то=будет заменено префиксом sysroot; см. --sysroot и -isysroot. -iquote dir-
Просмотреть dir только для заголовочных файлов, запрошенных с
#include "file"; они не просматриваются для#include <file>, перед всеми директориями, указанными с -I, и перед стандартными системными директориями. Если dir начинается с=, то=будет заменено префиксом 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-
Принимать универсальные имена символов в идентификаторах. Эта опция включена по умолчанию для C99 (и более поздних версий стандарта C) и 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 деактивирует эту опцию так же, как если бы -ftrack-macro-expansion не было указано в командной строке. Значение «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. -A predicate=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. См. (gcc)Developer Options.
- ‘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. С одной чертой, продолжить предварительную обработку в обычном режиме. С двумя чертами, выйти немедленно.
Далее: Опции ассемблера, Предыдущая: Опции инструментирования, Вверх: Вызов GCC [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.5.0/gcc/Preprocessor-Options.html