Spec-Zone.ru › GCC 10

Далее: Параметры, управляющие диалектами Objective-C и Objective-C++, Предыдущее: Параметры, управляющие диалектом C, Вверх: Параметры командной строки GCC [Оглавление][Индекс]

3.5 Параметры, управляющие диалектом C++ ¶

В этом разделе описываются параметры командной строки, имеющие смысл только для программ на C++. Также вы можете использовать большинство параметров компилятора GNU независимо от языка вашей программы. Например, вы можете скомпилировать файл firstClass.C так:

g++ -g -fstrict-enums -O -c firstClass.C

В этом примере только -fstrict-enums является параметром, предназначенным только для программ на C++; вы можете использовать другие параметры с любым языком, поддерживаемым GCC.

Некоторые параметры для компиляции программ на C, такие как -std, также актуальны для программ на C++. См. Параметры, управляющие диалектом C.

Вот список параметров, только для компиляции программ на C++:

-fabi-version=n

Использовать версию n C++ ABI. По умолчанию используется версия 0.

Версия 0 соответствует версии, максимально точно следующей спецификации C++ ABI. Поэтому ABI, полученная с помощью версии 0, может меняться в разных версиях G++, по мере исправления ошибок ABI.

Версия 1 — версия C++ ABI, впервые появившаяся в G++ 3.2.

Версия 2 — версия C++ ABI, впервые появившаяся в G++ 3.4 и являвшаяся стандартной по умолчанию до G++ 4.9.

Версия 3 исправляет ошибку в обработке константного адреса как аргумента шаблона.

Версия 4, появившаяся впервые в G++ 4.5, реализует стандартную обработку векторизованных типов.

Версия 5, появившаяся впервые в G++ 4.6, исправляет обработку атрибутов const/volatile для указателей на функции, decltype простого decl и использование параметра функции в объявлении другого параметра.

Версия 6, появившаяся впервые в G++ 4.7, исправляет поведение повышения типов для перечислений C++11 со сферой действия и обработку упаковок аргументов шаблонов, const/static_cast, префиксные ++ и –, а также функцию области класса, используемую как аргумент шаблона.

Версия 7, появившаяся впервые в G++ 4.8, обрабатывает nullptr_t как встроенный тип и исправляет обработку лямбда-выражений в области аргумента по умолчанию.

Версия 8, появившаяся впервые в G++ 4.9, исправляет поведение подстановки типов функций с квалификаторами функций.

Версия 9, появившаяся впервые в G++ 5.2, исправляет выравнивание nullptr_t.

Версия 10, появившаяся впервые в G++ 6.1, добавляет обработку атрибутов, влияющих на идентичность типов, таких как атрибуты вызова ia32 (например, ‘stdcall’).

Версия 11, появившаяся впервые в G++ 7, исправляет обработку выражений sizeof... и имен операторов. Для нескольких сущностей с одинаковым именем в функции, объявленных в разных областях, обработка теперь изменяется, начиная с двенадцатого вхождения. Также предполагает -fnew-inheriting-ctors.

Версия 12, появившаяся впервые в G++ 8, исправляет соглашения о вызовах для пустых классов на целевом x86_64 и для классов, содержащих только удаленные конструкторы копирования/перемещения. Случайно изменяет соглашения о вызовах для классов с удалённым конструктором копирования и тривиальным конструктором перемещения.

Версия 13, появившаяся впервые в G++ 8.2, исправляет случайную ошибку версии 12.

Версия 14, появившаяся впервые в G++ 10, исправляет обработку выражения nullptr.

См. также -Wabi.

-fabi-compat-version=n

На целевых платформах, поддерживающих сильные алиасы, G++ обходит изменения в обработке, создавая алиас с правильным именем при определении символа с неправильным именем. Этот переключатель задаёт, какую версию ABI использовать для алиаса.

С -fabi-version=0 (по умолчанию) это по умолчанию 11 (совместимость с GCC 7). Если выбрана другая версия ABI, это по умолчанию 0. Для совместимости с версиями GCC с 3.2 по 4.9 используйте -fabi-compat-version=2.

Если этот параметр не указан, но указан -Wabi=n, используется эта версия для совместимых алиасов. Если этот параметр указан вместе с -Wabi (без версии), используется версия из этого параметра для предупреждения.

-fno-access-control

Отключить всю проверку доступа. Этот переключатель в основном полезен для устранения ошибок в коде контроля доступа.

-faligned-new

Включить поддержку C++17 new типов, которые требуют большего выравнивания, чем void* ::operator new(std::size_t) предоставляет. Численный аргумент, например -faligned-new=32, может быть использован для указания, сколько выравнивания (в байтах) предоставляет эта функция, но мало пользователей захотят переопределять значение по умолчанию alignof(std::max_align_t).

Этот флаг включён по умолчанию для -std=c++17.

-fchar8_t
-fno-char8_t

Включить поддержку char8_t в соответствии со спецификацией C++2a. Это включает добавление нового char8_t фундаментального типа, изменения типов UTF-8 строк и символьных литералов, новые подписи для пользовательских литералов, связанные обновления стандартной библиотеки и новые __cpp_char8_t и __cpp_lib_char8_t макросы проверки возможностей.

Этот параметр позволяет перегружать функции для обычных и UTF-8 строк:

int f(const char *);    // #1
int f(const char8_t *); // #2
int v1 = f("text");     // Calls #1
int v2 = f(u8"text");   // Calls #2

и вводит новые подписи для пользовательских литералов:

int operator""_udl1(char8_t);
int v3 = u8'x'_udl1;
int operator""_udl2(const char8_t*, std::size_t);
int v4 = u8"text"_udl2;
template<typename T, T...> int operator""_udl3();
int v5 = u8"text"_udl3;

Изменение типов UTF-8 строк и символьных литералов вводит несовместимость с ISO C++11 и более поздними стандартами. Например, следующий код допустим в ISO C++11, но не допустим при указании -fchar8_t.

char ca[] = u8"xx";     // error: char-array initialized from wide
                        //        string
const char *cp = u8"xx";// error: invalid conversion from
                        //        `const char8_t*' to `const char*'
int f(const char*);
auto v = f(u8"xx");     // error: invalid conversion from
                        //        `const char8_t*' to `const char*'
std::string s{u8"xx"};  // error: no matching function for call to
                        //        `std::basic_string<char>::basic_string()'
using namespace std::literals;
s = u8"xx"s;            // error: conversion from
                        //        `basic_string<char8_t>' to non-scalar
                        //        type `basic_string<char>' requested
-fcheck-new

Проверить, что указатель, возвращаемый operator new, не равен NULL, прежде чем пытаться изменить выделенную память. Эта проверка обычно не нужна, потому что стандарт C++ определяет, что operator new возвращает 0, только если он объявлен throw(), в этом случае компилятор всегда проверяет возвращаемое значение, даже без этого параметра. Во всех остальных случаях, когда operator new имеет непустое описание исключения, переполнение памяти сигнализируется с помощью выбрасывания std::bad_alloc. См. также ‘new (nothrow)’.

-fconcepts
-fconcepts-ts

Ниже -std=c++2a, -fconcepts включает поддержку Технической спецификации расширений C++ для концепций, ISO 19217 (2015).

С -std=c++2a и выше, Концепции являются частью стандартного языка, поэтому -fconcepts включен по умолчанию. Но стандартное описание Концепций значительно отличается от TS, поэтому некоторые конструкции, которые допускались в TS, но не вошли в стандарт, по-прежнему можно включить с помощью -fconcepts-ts.

-fconstexpr-depth=n

Установить максимальную глубину вложенных вычислений для функций C++11 constexpr до n. Ограничение необходимо для обнаружения бесконечной рекурсии при вычислении константных выражений. Минимальное значение, задаваемое стандартом, составляет 512.

-fconstexpr-cache-depth=n

Установить максимальный уровень вложенности глубины вычислений для функций C++11 constexpr, которые будут кэшироваться до n. Это эвристика, которая балансирует скорость компиляции (когда кэш избегает повторных вычислений) и потребление памяти (когда кэш становится очень большим из-за сильно рекурсивных вычислений). По умолчанию значение равно 8. Вероятнее всего, мало пользователей захотят его изменить, но если ваш код выполняет сложные constexpr вычисления, вы можете попробовать подобрать значение, которое лучше всего подходит для вас.

-fconstexpr-loop-limit=n

Установить максимальное количество итераций цикла для функций C++14 constexpr до n. Ограничение необходимо для обнаружения бесконечных циклов при вычислении константных выражений. По умолчанию значение равно 262144 (1<<18).

-fconstexpr-ops-limit=n

Установить максимальное количество операций во время одного constexpr вычисления. Даже если количество итераций отдельного цикла ограничено вышеуказанным пределом, если есть несколько вложенных циклов, каждый из которых имеет много итераций, но всё же меньше вышеуказанного предела, или если в теле какого-либо цикла, или даже вне цикла, необходимо оценить слишком много выражений, результирующее constexpr вычисление может занять слишком много времени. По умолчанию значение равно 33554432 (1<<25).

-fcoroutines

Включить поддержку расширения корутин C++ (экспериментальная).

-fno-elide-constructors

Стандарт C++ позволяет реализации пропускать создание временного объекта, используемого только для инициализации другого объекта того же типа. Указание этого параметра отключает эту оптимизацию и заставляет G++ вызывать конструктор копирования во всех случаях. Этот параметр также заставляет G++ вызывать тривиальные члены-функции, которые в противном случае были бы встроены в код.

В C++17 компилятор обязан опустить эти временные объекты, но этот параметр всё ещё влияет на тривиальные члены-функции.

-fno-enforce-eh-specs

Не генерировать код для проверки нарушений спецификаций исключений во время выполнения. Этот параметр нарушает стандарт C++, но может быть полезен для уменьшения размера кода в производственных сборках, так же как и определение NDEBUG. Это не даёт коду пользователя разрешения на выбрасывание исключений в нарушение спецификаций исключений; компилятор всё ещё оптимизирует на основе спецификаций, поэтому выбрасывание неожиданного исключения приводит к неопределённому поведению во время выполнения.

-fextern-tls-init
-fno-extern-tls-init

Стандарты C++11 и OpenMP позволяют thread_local и threadprivate переменным иметь динамическую (время выполнения) инициализацию. Для поддержки этого любое использование такой переменной проходит через функцию-обёртку, которая выполняет любую необходимую инициализацию. Когда использование и определение переменной находятся в одном модуле трансляции, эта накладная стоимость может быть устранена, но когда использование находится в другом модуле трансляции, накладные расходы значительны, даже если переменной фактически не требуется динамическая инициализация. Если программист может быть уверен, что никакое использование переменной в модуле трансляции, отличном от модуля определения (либо потому, что переменная статически инициализирована, либо потому, что использование переменной в модуле определения будет выполнено до любого использования в другом модуле), они могут избежать этих накладных расходов с помощью параметра -fno-extern-tls-init.

На целевых платформах, поддерживающих алиасы символов, по умолчанию включен -fextern-tls-init. На целевых платформах, не поддерживающих алиасы символов, по умолчанию включен -fno-extern-tls-init.

-fno-gnu-keywords

Не распознавать typeof как ключевое слово, чтобы код мог использовать это слово как идентификатор. Вместо этого вы можете использовать ключевое слово __typeof__. Этот параметр подразумевается строгими диалектами ISO C++: -ansi, -std=c++98, -std=c++11 и т.д.

-fno-implicit-templates

Никогда не генерировать код для нестатических шаблонов, которые неявно инстанцируются (т. е. по использованию); генерировать код только для явных инстанциаций. Если вы используете этот параметр, вам необходимо тщательно структурировать код, включая все необходимые явные инстанциации, чтобы избежать неопределённых символов при линковке. См. Где шаблон? для получения дополнительной информации.

-fno-implicit-inline-templates

Также не генерировать код для неявных инстанциаций встроенных шаблонов.

-fno-implement-inlines

Для экономии памяти не генерировать внестрочные копии встроенных функций, управляемых #pragma implementation. Это вызывает ошибки линковщика, если эти функции не встроены везде, где они вызываются.

-fms-extensions

Отключить предупреждения Wpedantic о конструкциях, используемых в MFC, таких как неявные int и получение указателя на член функции через нестандартный синтаксис.

-fnew-inheriting-ctors

Включить корректировку P0136 к семантике наследования конструкторов C++11. Это часть C++17, но также рассматривается как отчет об ошибке для C++11 и C++14. Этот флаг включён по умолчанию, если не указан -fabi-version=10 или ниже.

-fnew-ttp-matching

Включить решение P0522 для проблемы ядра 150, шаблонов шаблонов и аргументов по умолчанию: это позволяет использовать шаблон с аргументами шаблона по умолчанию в качестве аргумента для параметра шаблона шаблона с меньшим количеством параметров шаблона. Этот флаг включён по умолчанию для -std=c++17.

-fno-nonansi-builtins

Отключить встроенные объявления функций, не предписанные ANSI/ISO C. К ним относятся ffs, alloca, _exit, index, bzero, conjf, и другие связанные функции.

-fnothrow-opt

Обрабатывать спецификацию исключения throw() так, как будто это спецификация noexcept, чтобы уменьшить или устранить издержки на размер текста по сравнению с функцией без спецификации исключения. Если у функции есть локальные переменные типов с нетривиальными деструкторами, спецификация исключений фактически уменьшает размер функции, поскольку можно оптимизировать обработку исключений для этих переменных. Семантический эффект заключается в том, что исключение, выброшенное из функции с такой спецификацией исключений, приводит к вызову terminate вместо unexpected.

-fno-operator-names

Не рассматривать ключевые слова имен операторов and, bitand, bitor, compl, not, or и xor как синонимы ключевых слов.

-fno-optional-diags

Отключить диагностику, которую стандарт предписывает компилятору не выводить. В настоящее время единственная такая диагностика, выводимая G++, это диагностика для имени, имеющего несколько значений внутри класса.

-fpermissive

Снизить некоторые диагностические сообщения о несоответствующем коде с ошибок до предупреждений. Таким образом, использование -fpermissive позволяет компилировать некоторый несоответствующий код.

-fno-pretty-templates

Когда сообщение об ошибке относится к специализации функции-шаблона, компилятор обычно печатает сигнатуру шаблона, за которой следуют аргументы шаблона и любые типы или имена типов в сигнатуре (например, void f(T) [with T = int] вместо void f(int)), чтобы было ясно, какой шаблон участвует. Когда сообщение об ошибке относится к специализации шаблона класса, компилятор опускает любые аргументы шаблона, которые соответствуют аргументам шаблона по умолчанию для этого шаблона. Если любое из этих поведений затрудняет, а не упрощает понимание сообщения об ошибке, вы можете использовать -fno-pretty-templates для их отключения.

-fno-rtti

Отключить генерацию информации о каждом классе с виртуальными функциями для использования функциями динамического определения типа C++ (dynamic_cast и typeid). Если вы не используете эти части языка, вы можете сэкономить некоторое место, используя этот флаг. Обратите внимание, что обработка исключений использует ту же информацию, но G++ генерирует её по мере необходимости. Оператор dynamic_cast всё ещё может использоваться для приведений, не требующих информации о типе во время выполнения, то есть для приведений к void * или к однозначным базовым классам.

Смешение кода, скомпилированного с -frtti, с кодом, скомпилированным с -fno-rtti, может не работать. Например, программы могут не связаться, если класс, скомпилированный с -fno-rtti, используется в качестве базового класса для класса, скомпилированного с -frtti.

-fsized-deallocation

Включить встроенные глобальные объявления

void operator delete (void *, std::size_t) noexcept;
void operator delete[] (void *, std::size_t) noexcept;

как это было введено в C++14. Это полезно для функций пользовательской замены освобождения, которые, например, используют размер объекта для ускорения освобождения. Включено по умолчанию при -std=c++14 и выше. Флаг -Wsized-deallocation предупреждает о местах, где может понадобиться добавление определения.

-fstrict-enums

Разрешить компилятору оптимизировать, предполагая, что значение перечислимого типа может быть только одним из значений перечисления (как определено в стандарте C++ ; по сути, значение, которое может быть представлено минимальным количеством битов, необходимым для представления всех перечислителей). Это предположение может быть неверным, если программа использует приведение для преобразования произвольного целочисленного значения в перечислимый тип.

-fstrong-eval-order

Вычислять обращение к членам, индексирование массивов и сдвиги в левостороннем порядке и вычислять присваивание в правостороннем порядке, как принято для C++17. Включено по умолчанию с -std=c++17. -fstrong-eval-order=some включает только порядок доступа к членам и сдвигов и является значением по умолчанию без -std=c++17.

-ftemplate-backtrace-limit=n

Установить максимальное количество заметок о подстановке шаблона для одного предупреждения или ошибки в n. Значение по умолчанию равно 10.

-ftemplate-depth=n

Установить максимальную глубину подстановки шаблонов для шаблонов классов в n. Ограничение глубины подстановки шаблонов необходимо для обнаружения бесконечных рекурсий во время подстановки шаблонов классов. Программы, соответствующие ANSI/ISO C++, не должны полагаться на максимальную глубину, превышающую 17 (изменено на 1024 в C++11). Значение по умолчанию равно 900, поскольку в некоторых ситуациях компилятор может исчерпать память стека, прежде чем достигнет 1024.

-fno-threadsafe-statics

Не генерировать дополнительный код для использования процедур, указанных в C++ ABI, для безопасной по отношению к потокам инициализации локальных статических переменных. Вы можете использовать этот параметр, чтобы немного уменьшить размер кода в коде, который не должен быть безопасным для потоков.

-fuse-cxa-atexit

Регистрировать деструкторы объектов со статической длиной хранения с помощью функции __cxa_atexit вместо функции atexit. Этот параметр необходим для полной поддержки обработки статических деструкторов согласно стандарту, но работает только, если ваша C-библиотека поддерживает __cxa_atexit.

-fno-use-cxa-get-exception-ptr

Не использовать функцию времени выполнения __cxa_get_exception_ptr. Это приводит к тому, что std::uncaught_exception становится неверным, но необходимо, если функция времени выполнения недоступна.

-fvisibility-inlines-hidden

Этот переключатель объявляет, что пользователь не пытается сравнивать указатели на встроенные функции или методы, где адреса двух функций берутся в разных общих объектах.

Это означает, что GCC может фактически пометить встроенные методы с __attribute__ ((visibility ("hidden"))), чтобы они не появлялись в таблице экспорта DSO и не требовали перехода через PLT при использовании внутри DSO. Включение этого параметра может существенно повлиять на время загрузки и компоновки DSO, так как это значительно уменьшает размер динамической таблицы экспорта, когда библиотека активно использует шаблоны.

Поведение этого переключателя немного отличается от прямого обозначения методов как скрытых, так как это не влияет на статические переменные, локальные для функции, и не заставляет компилятор заключить, что функция определена только в одном общем объекте.

Вы можете явно обозначить метод как имеющий видимость, чтобы отменить действие переключателя для этого метода. Например, если вы хотите сравнивать указатели на конкретный встроенный метод, вы можете обозначить его как имеющий видимость по умолчанию. Отметка включающего класса видимость явно не имеет эффекта.

Явно проинстанцированные встроенные методы не затрагиваются этим параметром, так как их связь может пересекать границу общей библиотеки. См. Где шаблон?.

-fvisibility-ms-compat

Этот флаг пытается использовать параметры видимости для совместимости модели связи C++ GCC с моделью связи Microsoft Visual Studio.

Флаг вносит эти изменения в модель связи GCC:

  1. Он устанавливает видимость по умолчанию в hidden, как -fvisibility=hidden.
  2. Типы, но не их члены, не скрываются по умолчанию.
  3. Правило одной дефиниции ослаблено для типов без явных параметров видимости, определённых более чем в одном общем объекте: эти объявления разрешены, если они разрешены, когда этот параметр не используется.

В новом коде лучше использовать -fvisibility=hidden и экспортировать те классы, которые должны быть видимы извне. К сожалению, код может полагаться, возможно, случайно, на поведение Visual Studio.

Среди последствий этих изменений — то, что статические члены данных одного типа с одинаковым именем, но определённые в разных общих объектах, являются разными, поэтому изменение одного не меняет другое; и что указатели на члены функций, определённые в разных общих объектах, могут не сравниваться как равные. При задании этого флага нарушение ODR происходит при определении типов с одинаковым именем в разных местах.

-fno-weak

Не использовать поддержку слабых символов, даже если она предоставляется компоновщиком. По умолчанию G++ использует слабые символы, если они доступны. Этот параметр существует только для тестирования и не должен использоваться конечными пользователями; он приводит к худшему коду и не имеет преимуществ. Этот параметр может быть удален в будущих версиях G++.

-fext-numeric-literals (C++ and Objective-C++ only)

Принимать мнимые, фиксированные или определённые машиной суффиксы числовых литералов как расширения GNU. Когда этот параметр выключен, эти суффиксы обрабатываются как числовые суффиксы пользовательских литералов C++11. Он включён по умолчанию для всех диалектов до C++11 и всех диалектов GNU: -std=c++98, -std=gnu++98, -std=gnu++11, -std=gnu++14. Этот параметр выключен по умолчанию для стандарта ISO C++11 и далее (-std=c++11, ...).

-nostdinc++

Не искать файлы заголовков в стандартных каталогах, специфичных для C++, но по-прежнему искать в других стандартных каталогах. (Этот параметр используется при построении библиотеки C++.)

Кроме того, эти параметры предупреждений имеют смысл только для C++ программ:

-Wabi-tag (C++ and Objective-C++ only)

Выдавать предупреждение, когда тип с тегом ABI используется в контексте, не имеющем этот тег ABI. См. Атрибуты переменных, функций и типов на C++ для получения дополнительной информации о тегах ABI.

-Wcomma-subscript (C++ and Objective-C++ only)

Выдавать предупреждение об использовании выражения с запятой в выражении индексирования. Это использование было устаревшим в C++2a. Однако выражение с запятой, заключенное в ( ), не устарело. Пример:

void f(int *a, int b, int c) {
    a[b,c];     // deprecated
    a[(b,c)];   // OK
}

Включается по умолчанию с -std=c++2a.

-Wctor-dtor-privacy (C++ and Objective-C++ only)

Выдавать предупреждение, когда класс кажется непригодным для использования, потому что все конструкторы или деструкторы в этом классе являются закрытыми, и у него нет ни друзей, ни общедоступных статических функций-членов. Также выдавать предупреждение, если нет ни одной открытой функции-члена, и есть как минимум одна закрытая функция-член, которая не является конструктором или деструктором.

-Wdelete-non-virtual-dtor (C++ and Objective-C++ only)

Выдавать предупреждение, когда delete используется для уничтожения экземпляра класса, имеющего виртуальные функции и невиртуальный деструктор. Небезопасно удалять экземпляр производного класса через указатель на базовый класс, если у базового класса нет виртуального деструктора. Это предупреждение включено параметром -Wall.

-Wdeprecated-copy (C++ and Objective-C++ only)

Выдавать предупреждение, что неявное объявление копирующего конструктора или оператора копирующей присваивания устарело, если класс имеет пользовательский копирующий конструктор или оператор копирующей присваивания, начиная с C++11. Это предупреждение включается параметром -Wextra. С -Wdeprecated-copy-dtor также устаревать, если класс имеет пользовательский деструктор.

-Wno-init-list-lifetime (C++ and Objective-C++ only)

Не выдавать предупреждений об использовании std::initializer_list, которые, вероятно, приведут к висячим указателям. Поскольку базовый массив для initializer_list обрабатывается как обычный временный объект C++, легко непреднамеренно сохранить указатель на массив после окончания жизненного цикла массива. Например:

  • Если функция возвращает временный initializer_list, или локальную initializer_list переменную, жизненный цикл массива заканчивается в конце оператора возврата, поэтому возвращаемое значение имеет висячий указатель.
  • Если оператор new создаёт initializer_list, массив живёт только до конца включающего полного выражения, поэтому initializer_list в куче имеет висячий указатель.
  • Когда переменная initializer_list присваивается из списка инициализаторов в фигурных скобках, временный массив, созданный для правой части присваивания, живёт только до конца полного выражения, поэтому в следующем операторе переменная initializer_list имеет висячий указатель.
    // li's initial underlying array lives as long as li
    std::initializer_list<int> li = { 1,2,3 };
    // assignment changes li to point to a temporary array
    li = { 4, 5 };
    // now the temporary is gone and li has a dangling pointer
    int i = li.begin()[0] // undefined behavior
  • Когда конструктор списка хранит указатель begin из аргумента initializer_list, это не продлевает срок жизни массива, поэтому если переменная класса конструируется из временного initializer_list, указатель остается висящим к концу оператора объявления переменной.
-Wno-literal-suffix (C++ and Objective-C++ only)

Не выдавать предупреждения, когда строковый или символьный литерал следует за суффиксом ud, который не начинается с подчеркивания. В соответствии с расширениями GCC такие суффиксы обрабатываются как отдельные токены предварительной обработки, чтобы сохранить обратную совместимость с кодом, использующим макросы форматирования из <inttypes.h>. Например:

#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#include <stdio.h>

int main() {
  int64_t i64 = 123;
  printf("My int64: %" PRId64"\n", i64);
}

В этом случае PRId64 обрабатывается как отдельный токен предварительной обработки.

Этот параметр также управляет предупреждениями, когда оператор пользовательской литеральной константы объявляется с идентификатором суффикса литерала, который не начинается с подчеркивания. Идентификаторы суффиксов литералов, которые не начинаются с подчеркивания, зарезервированы для будущей стандартизации.

Эти предупреждения включены по умолчанию.

-Wno-narrowing (C++ and Objective-C++ only)

Для стандартов C++11 и более поздних версий сужения преобразований диагностируются по умолчанию, как требуется стандартом. Преобразование сужения из константы приводит к ошибке, а преобразование сужения из неконстантного значения — к предупреждению, но -Wno-narrowing подавляет диагностику. Обратите внимание, что это не влияет на смысл корректного кода; сужения преобразований по-прежнему считаются некорректными в контекстах SFINAE.

С -Wnarrowing в C++98 выдавать предупреждение, когда встречается запрещённое C++11 сужение преобразования в ‘{ }’, например:

int i = { 2.2 }; // error: narrowing from double to int

Этот флаг включен в -Wall и -Wc++11-compat.

-Wnoexcept (C++ and Objective-C++ only)

Выдавать предупреждение, если выражение noexcept вычисляет ложь из-за вызова функции, не имеющей спецификации небросания исключений (т. е. throw() или noexcept), но известной компилятору как небросающей исключений.

-Wnoexcept-type (C++ and Objective-C++ only)

Выдавать предупреждение, если функция C++17, делающая noexcept частью типа функции, изменяет закодированное имя символа по отношению к C++14. Включается параметрами -Wabi и -Wc++17-compat.

В качестве примера:

template <class T> void f(T t) { t(); };
void g() noexcept;
void h() { f(g); }

В C++14, f вызывает f<void(*)()>, а в C++17 — f<void(*)()noexcept>.

-Wclass-memaccess (C++ and Objective-C++ only)

Выдавать предупреждение, когда место назначения вызова функции необработанной памяти, такой как memset или memcpy, является объектом класса, и когда запись в такой объект может обойти конструктор или копирующее присваивание класса, нарушить корректность const или инкапсуляцию, или повредить указатели на виртуальную таблицу. Изменение представления таких объектов может нарушить инварианты, поддерживаемые функциями-членами класса. Например, вызов memset ниже не определён, так как он изменяет объект нетривиального класса и, следовательно, диагностируется. Безопасный способ инициализации или очистки хранилища объектов таких типов — использование соответствующего конструктора или оператора присваивания, если таковой имеется.

std::string str = "abc";
memset (&str, 0, sizeof str);

Параметр -Wclass-memaccess включён параметром -Wall. Явное приведение указателя на объект класса к void * или к типу, который может быть безопасно доступен функцией необработанной памяти, подавляет предупреждение.

-Wnon-virtual-dtor (C++ and Objective-C++ only)

Выдавать предупреждение, если класс имеет виртуальные функции и доступный невиртуальный деструктор сам по себе или в доступном полиморфном базовом классе, в этом случае возможно, но небезопасно удалить экземпляр производного класса через указатель на сам класс или базовый класс. Это предупреждение автоматически включено, если указан параметр -Weffc++.

-Wregister (C++ and Objective-C++ only)

Выдавать предупреждение об использовании спецификатора класса хранения register, за исключением случаев, когда он является частью расширения GNU Переменные в заданных регистрах. Использование ключевого слова register в качестве спецификатора класса хранения устарело в C++11 и удалено в C++17. Включается по умолчанию с -std=c++17.

-Wreorder (C++ and Objective-C++ only)

Выдавать предупреждение, когда порядок инициализаторов членов, указанный в коде, не соответствует порядку их выполнения. Например:

struct A {
  int i;
  int j;
  A(): j (0), i (1) { }
};

Компилятор переупорядочивает инициализаторы членов для i и j в соответствии с порядком объявления членов, выводит предупреждение об этом. Это предупреждение включено параметром -Wall.

-Wno-pessimizing-move (C++ and Objective-C++ only)

Это предупреждение выдаётся, когда вызов std::move препятствует устранению копирования. Типичный сценарий, когда может произойти устранение копирования, — это возврат в функции с типом возвращаемого значения класса, когда выражение, возвращаемое в функцию, является именем непеременной автоматической переменной и не является параметром функции и имеет тот же тип, что и тип возвращаемого значения функции.

struct T {
…
};
T fn()
{
  T t;
  …
  return std::move (t);
}

Но в этом примере вызов std::move препятствует устранению копирования.

Это предупреждение включено параметром -Wall.

-Wno-redundant-move (C++ and Objective-C++ only)

Это предупреждение выдаётся о лишних вызовах std::move; то есть, когда операция перемещения была бы выполнена и без вызова std::move. Это происходит потому, что компилятор вынужден рассматривать объект как будто он был бы lvalue в определенных ситуациях, таких как возврат локальной переменной, где устранение копирования неприменимо. Рассмотрим:

struct T {
…
};
T fn(T t)
{
  …
  return std::move (t);
}

Здесь вызов std::move избыточен. Так как G++ реализует Проблему ядра 1579, ещё одним примером является:

struct T { // convertible to U
…
};
struct U {
…
};
U fn()
{
  T t;
  …
  return std::move (t);
}

В этом примере устранение копирования не применимо, так как типы возвращаемого выражения и типа возвращаемого значения функции различны, тем не менее G++ рассматривает возвращаемое значение как будто оно было обозначено lvalue.

Это предупреждение включается параметром -Wextra.

-Wredundant-tags (C++ and Objective-C++ only)

Выдавать предупреждение о лишних ключевых словах class и enum при ссылках на типы классов и перечислимые типы в контекстах, где ключевые слова могут быть устранены без создания неоднозначности. Например:

struct foo;
struct foo *p;   // warn that keyword struct can be eliminated

С другой стороны, в этом примере предупреждение не выдаётся:

struct foo;
void foo ();   // "hides" struct foo
void bar (struct foo&);  // no warning, keyword struct is necessary
-Wno-subobject-linkage (C++ and Objective-C++ only)

Не выдавать предупреждения, если тип класса имеет базовый класс или поле, тип которого использует анонимный пространство имён или зависит от типа без связи. Если тип A зависит от типа B без или внутренней связи, определение его в нескольких единицах трансляции будет нарушением ODR, так как значение B различно в каждой единице трансляции. Если A встречается только в одной единице трансляции, лучший способ подавить предупреждение — присвоить ему внутреннюю связь, поместив его также в анонимное пространство имён. Компилятор не выдаёт это предупреждение для типов, определённых в основном файле .C, так как они вряд ли будут иметь несколько определений.-Wsubobject-linkage включено по умолчанию.

-Weffc++ (C++ and Objective-C++ only)

Предупреждать о нарушениях следующих рекомендаций по стилю из серии книг Scott Meyers «Effective C++»:

  • Определять конструктор копирования и оператор присваивания для классов с динамически выделенной памятью.
  • Предпочитать инициализацию присваиванию в конструкторах.
  • Функция operator= должна возвращать ссылку на *this.
  • Не пытаться возвращать ссылку, когда нужно возвращать объект.
  • Различать префиксные и постфиксные формы операторов инкремента и декремента.
  • Никогда не перегружать &&, ||, или ,.

Этот параметр также включает -Wnon-virtual-dtor, который также является одной из рекомендаций Effective C++. Однако проверка расширена, чтобы предупреждать о отсутствии виртуального деструктора в доступных неполиморфных базовых классах тоже.

При выборе этого параметра помните, что заголовочные файлы стандартной библиотеки не всегда следуют всем этим рекомендациям; используйте ‘grep -v’ для фильтрации этих предупреждений.

-Wstrict-null-sentinel (C++ and Objective-C++ only)

Предупреждать об использовании неявного NULL в качестве стоп-значения. При компиляции только с GCC это допустимое стоп-значение, так как NULL определено как __null. Хотя это константа указателя на ноль, а не сам нулевой указатель, гарантируется, что её размер совпадает с размером указателя. Однако это использование не является переносимым между разными компиляторами.

-Wno-non-template-friend (C++ and Objective-C++ only)

Отключать предупреждения, когда нешаблонные дружественные функции объявлены внутри шаблона. В очень старых версиях GCC, предшествующих реализации ISO стандарта, объявления, такие как ‘friend int foo(int)’, где имя друга является неквалифицированным идентификатором, могли интерпретироваться как особая специализация шаблонной функции; это предупреждение предназначено для диагностики проблем совместимости и включено по умолчанию.

-Wold-style-cast (C++ and Objective-C++ only)

Предупреждать, если используется старое (C-стиль) приведение типов к типу, не являющемуся void, в C++ программе. Новые приведения типов (dynamic_cast, static_cast, reinterpret_cast, и const_cast) менее уязвимы к непреднамеренным эффектам и их гораздо проще искать.

-Woverloaded-virtual (C++ and Objective-C++ only)

Предупреждать, когда объявление функции скрывает виртуальные функции базового класса. Например, в:

struct A {
  virtual void f();
};

struct B: public A {
  void f(int);
};

версия класса A функции f скрыта в B, и код, подобный:

B* b;
b->f();

не будет компилироваться.

-Wno-pmf-conversions (C++ and Objective-C++ only)

Отключить диагностику преобразования связанного указателя на член-функцию в обычный указатель.

-Wsign-promo (C++ and Objective-C++ only)

Предупреждать, когда разрешение перегрузки выбирает продвижение от беззнакового или перечислимого типа к знакомому типу вместо преобразования к беззнаковому типу того же размера. Предыдущие версии G++ пытались сохранить беззнаковость, но стандарт предписывает текущее поведение.

-Wtemplates (C++ and Objective-C++ only)

Предупреждать при обнаружении объявления первичного шаблона. Некоторые правила кодирования запрещают шаблоны, и это может использоваться для их принудительного соблюдения. Предупреждение неактивно внутри системных заголовочных файлов, таких как STL, поэтому STL можно по-прежнему использовать. Также можно инстанцировать или специализировать шаблоны.

-Wmismatched-tags (C++ and Objective-C++ only)

Предупреждать об объявлениях структур, классов и шаблонов классов и их специализаций с ключом класса, который не соответствует ни определению, ни первому объявлению, если определение не предоставлено.

Например, объявление struct Object в списке аргументов draw вызывает предупреждение. Чтобы избежать его, либо удалите избыточный ключ класса struct, либо замените его на class, чтобы соответствовать определению.

class Object {
public:
  virtual ~Object () = 0;
};
void draw (struct Object*);

Объявлять класс с ключом класса struct не является ошибкой, как показано в примере выше. Параметр -Wmismatched-tags предназначен для достижения согласованного стиля объявления классов. В коде, который должен быть переносимым на компиляторы Windows, это предупреждение помогает предотвратить неразрешенные ссылки из-за различий в формировании символов, объявленных с разными ключами класса. Параметр может использоваться как самостоятельно, так и в сочетании с -Wredundant-tags.

-Wmultiple-inheritance (C++ and Objective-C++ only)

Предупреждать, когда класс определён с несколькими прямыми базовыми классами. Некоторые правила кодирования запрещают множественное наследование, и это может использоваться для принудительного соблюдения этого правила. Предупреждение неактивно внутри системных заголовочных файлов, таких как STL, так что STL по-прежнему можно использовать. Также можно определять классы, которые косвенно используют множественное наследование.

-Wvirtual-inheritance

Предупреждать, когда класс определяется с виртуальным прямым базовым классом. Некоторые правила кодирования запрещают множественное наследование, и это может использоваться для принудительного соблюдения этого правила. Предупреждение неактивно внутри системных заголовочных файлов, таких как STL, так что STL по-прежнему можно использовать. Также можно определять классы, которые косвенно используют виртуальное наследование.

-Wno-virtual-move-assign

Подавлять предупреждения о наследовании от виртуального базового класса с нетривиальным оператором перемещения присваивания C++11. Это опасно, потому что если к виртуальному базовому классу есть доступ по нескольким путям, то он перемещается несколько раз, что может означать, что оба объекта окажутся в перемещённом состоянии. Если оператор перемещения присваивания написан так, чтобы избегать перемещения из объекта, перемещённого из, то это предупреждение можно отключить.

-Wnamespaces

Предупреждать при открытии определения пространства имён. Некоторые правила кодирования запрещают пространства имён, и это может использоваться для их принудительного соблюдения. Предупреждение неактивно внутри системных заголовочных файлов, таких как STL, так что STL по-прежнему можно использовать. Также можно использовать директивы using и квалифицированные имена.

-Wno-terminate (C++ and Objective-C++ only)

Отключить предупреждение о выражении throw, которое немедленно приведёт к вызову terminate.

-Wno-class-conversion (C++ and Objective-C++ only)

Не предупреждать, когда функция преобразования преобразует объект в тот же тип, в базовый класс этого типа или в void; такая функция преобразования никогда не будет вызвана.

-Wvolatile (C++ and Objective-C++ only)

Предупреждать о устаревших использованиях квалификатора volatile. Это включает постфиксные и префиксные ++ и -- выражения volatile-квалифицированных типов, использование простых присваиваний, где левый операнд является volatile-квалифицированным неклассовым типом для их значения, составных присваиваний, где левый операнд является volatile-квалифицированным неклассовым типом, volatile-квалифицированный возвращаемый тип функции, volatile-квалифицированный тип параметра и структурированные привязки volatile-квалифицированного типа. Это использование было устаревшим в C++20.

Включено по умолчанию с -std=c++2a.

-Wzero-as-null-pointer-constant (C++ and Objective-C++ only)

Предупреждать, когда литерал ‘0’ используется как константа нулевого указателя. Это может быть полезно для облегчения преобразования в nullptr в C++11.

-Waligned-new

Предупреждать об операторе new, создающем объект типа, требующего большего выравнивания, чем alignof(std::max_align_t), но использующего функцию выделения без явного параметра выравнивания. Этот параметр включён с -Wall.

В обычном случае это предупреждение относится только к глобальным функциям выделения, но -Waligned-new=all также предупреждает о функциях выделения членов класса.

-Wno-placement-new
-Wplacement-new=n

Предупреждать о выражениях placement new с неопределённым поведением, например, о конструировании объекта в буфере, меньшем, чем размер типа объекта. Например, выражение placement new ниже диагностируется, так как оно пытается сконструировать массив из 64 целых чисел в буфере размером только 64 байта.

char buf [64];
new (buf) int[64];

Это предупреждение включено по умолчанию.

-Wplacement-new=1

Это уровень предупреждений по умолчанию для -Wplacement-new. На этом уровне предупреждение не выдаётся для некоторых строго неопределённых конструкций, которые GCC допускает как расширения для совместимости со старым кодом. Например, следующее new выражение не диагностируется на этом уровне, хотя оно имеет неопределённое поведение согласно стандарту C++, поскольку оно записывает данные за пределы одноэлементного массива.

struct S { int n, a[1]; };
S *s = (S *)malloc (sizeof *s + 31 * sizeof s->a[0]);
new (s->a)int [32]();
-Wplacement-new=2

На этом уровне, помимо диагностики тех же конструкций, что и на уровне 1, предупреждение также выдаётся для выражений placement new, которые конструируют объект в последнем члене структуры, тип которой является массивом из одного элемента, и размер которого меньше размера конструируемого объекта. В то время как предыдущий пример был бы диагностирован, следующая конструкция использует расширение гибкого массива членов, чтобы избежать предупреждения на уровне 2.

struct S { int n, a[]; };
S *s = (S *)malloc (sizeof *s + 32 * sizeof s->a[0]);
new (s->a)int [32]();
-Wcatch-value
-Wcatch-value=n (C++ and Objective-C++ only)

Предупреждать о обработчиках catch, которые не ловят значения по ссылке. С -Wcatch-value=1 (или -Wcatch-value для краткости) предупреждать о полиморфных типах классов, которые ловятся по значению. С -Wcatch-value=2 предупреждать обо всех типах классов, которые ловятся по значению. С -Wcatch-value=3 предупреждать обо всех типах, которые не ловятся по ссылке. -Wcatch-value включено с -Wall.

-Wconditionally-supported (C++ and Objective-C++ only)

Предупреждать об условно поддерживаемых (C++11 [intro.defs]) конструкциях.

-Wno-delete-incomplete (C++ and Objective-C++ only)

Не предупреждать при удалении указателя на неполный тип, что может привести к неопределённому поведению во время выполнения. Это предупреждение включено по умолчанию.

-Wextra-semi (C++, Objective-C++ only)

Предупреждать о лишних точках с запятой после определений функций внутри класса.

-Wno-inaccessible-base (C++, Objective-C++ only)

Этот параметр контролирует предупреждения, когда базовый класс недоступен в производном классе из-за неоднозначности. Предупреждение включено по умолчанию. Обратите внимание, что предупреждение о неоднозначных виртуальных базах включено с -Wextra.

struct A { int a; };

struct B : A { };

struct C : B, A { };
-Wno-inherited-variadic-ctor

Подавить предупреждения об использовании конструкторов наследования C++11, когда базовый класс, от которого происходит наследование, имеет C-вариационный конструктор; предупреждение включено по умолчанию, поскольку эллипс не наследуется.

-Wno-invalid-offsetof (C++ and Objective-C++ only)

Подавить предупреждения от применения макроса offsetof к типу, не являющемуся POD. Согласно стандарту ISO C++ 2014, применение offsetof к типу, не имеющему стандартного расположения, неопределено. Однако в существующих реализациях C++ offsetof обычно даёт осмысленные результаты. Этот флаг предназначен для пользователей, которые знают, что они пишут непереносимый код и сознательно решили игнорировать предупреждение об этом.

Ограничения на offsetof могут быть ослаблены в будущей версии стандарта C++.

-Wsized-deallocation (C++ and Objective-C++ only)

Предупреждать о определении функции без размера для освобождения памяти

void operator delete (void *) noexcept;
void operator delete[] (void *) noexcept;

без определения соответствующей функции для освобождения памяти с размером

void operator delete (void *, std::size_t) noexcept;
void operator delete[] (void *, std::size_t) noexcept;

или наоборот. Включается параметром -Wextra вместе с -fsized-deallocation.

-Wsuggest-final-types

Предупреждать о типах с виртуальными методами, где качество кода улучшилось бы, если бы тип был объявлен с помощью спецификатора C++11 final, или, если возможно, объявлен в анонимном пространстве имен. Это позволяет GCC более агрессивно девиртуализировать полиморфные вызовы. Это предупреждение эффективнее при оптимизации на этапе линковки, где информация о графе иерархии классов более полная.

-Wsuggest-final-methods

Предупреждать о виртуальных методах, где качество кода улучшилось бы, если бы метод был объявлен с помощью спецификатора C++11 final, или, если возможно, его тип был объявлен в анонимном пространстве имен или со спецификатором final. Это предупреждение эффективнее при оптимизации на этапе линковки, где информация о графе иерархии классов более полная. Рекомендуется сначала рассмотреть предложения -Wsuggest-final-types, а затем перестроить с новыми аннотациями.

-Wsuggest-override

Предупреждать об переопределении виртуальных функций, которые не помечены ключевым словом override.

-Wuseless-cast (C++ and Objective-C++ only)

Предупреждать, когда выражение приводится к своему собственному типу.

-Wno-conversion-null (C++ and Objective-C++ only)

Не выводить предупреждения для преобразований между NULL и типами без указателей. -Wconversion-null включен по умолчанию.

Далее: Параметры, контролирующие диалекты Objective-C и Objective-C++, Предыдущее: Параметры, контролирующие диалект C, Вверх: Команды GCC [Содержание][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.5.0/gcc/C_002b_002b-Dialect-Options.html

Spec-Zone.ru

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