Spec-Zone.ru › GCC 5

3.11 Параметры, управляющие препроцессором

Эти параметры управляют 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 сообщит об этом как об неиспользуемом. Чтобы избежать предупреждения в таком случае, можно улучшить область определения макроса, например, переместив его в первый пропущенный блок. В качестве альтернативы, можно предоставить фиктивное использование с помощью чего-то подобного:

#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 и ранее.

-MF file

При использовании с -M или -MM, указывает файл, в который будут записаны зависимости. Если переключатель -MF не задан, препроцессор отправляет правила в то же место, в которое он отправил бы предварительно обработанный вывод.

При использовании с опциями драйвера -MD или -MMD, -MF переопределяет файл вывода зависимостей по умолчанию.

-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, за исключением того, что упоминаются только заголовочные файлы пользователя, а не системные.

-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 может быть одним из:

c90
c89
iso9899:1990

Стандарт ISO C от 1990 года. ‘c90’ — это обычное сокращение для этой версии стандарта.

Параметр -ansi эквивалентен -std=c90.

iso9899:199409

Стандарт C 1990 года, изменённый в 1994 году.

iso9899:1999
c99
iso9899:199x
c9x

Переработанный стандарт ISO C, опубликованный в декабре 1999 года. До публикации он был известен как C9X.

iso9899:2011
c11
c1x

Переработанный стандарт ISO C, опубликованный в декабре 2011 года. До публикации он был известен как C1X.

gnu90
gnu89

Стандарт C 1990 года плюс расширения GNU. Это значение по умолчанию.

gnu99
gnu9x

Стандарт C 1999 года плюс расширения GNU.

gnu11
gnu1x

Стандарт C 2011 года плюс расширения GNU.

c++98

Стандарт ISO C++ 1998 года плюс поправки.

gnu++98

То же, что -std=c++98 плюс расширения GNU. Это значение по умолчанию для кода C++.

-I-

Разделяет путь к include. Все каталоги, указанные с помощью параметров -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, и добавьте полученный каталог к пути поиска include. -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, в компилятор без проблем. В этом режиме интегрированный препроцессор представляет собой не более чем токенизатор для front end.

-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)Debugging 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-5.5.0/gcc/Preprocessor-Options.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API