Spec-Zone.ru › GCC 8

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 scoped enums и преобразование пакетов шаблонов аргументов, const/static_cast, префикс ++ и –, и функцию области класса, используемую в качестве шаблона аргумента.

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

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

Версия 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.

См. также -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.

-fcheck-new

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

-fconcepts

Включить поддержку технической спецификации C++ Extensions for Concepts, ISO 19217 (2015), которая позволяет использовать код, подобный:

template <class T> concept bool Addable = requires (T t) { t + t; };
template <Addable T> T add (T a, T b) { return a + b; }
-fconstexpr-depth=n

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

-fconstexpr-loop-limit=n

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

-fdeduce-init-list

Включить выведение параметра типа шаблона в виде std::initializer_list из списка инициализации в фигурных скобках, т. е.:

template <class T> auto forward(T t) -> decltype (realfn (t))
{
  return realfn (t);
}

void f()
{
  forward({1,2}); // call forward<std::initializer_list<int>>
}

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

-ffriend-injection

Вставить дружественные функции в окружающий пространство имён, чтобы они были видны вне области класса, в котором они объявлены. Дружественные функции были описаны как работающие таким образом в старом документе «Аннотированная справка по C++». Однако в ISO C++ дружественная функция, не объявленная в окружающем пространстве имён, может быть найдена только с помощью зависимого от аргументов поиска. G++ по умолчанию использует стандартное поведение.

Этот параметр устарел и будет удалён.

-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 переменные имеют динамическую (runtime) инициализацию. Для поддержки этого любое использование такой переменной проходит через функцию-обёртку, которая выполняет любую необходимую инициализацию. Когда использование и определение переменной находятся в одном модуле трансляции, эта накладная стоимость может быть оптимизирована, но когда использование находится в другом модуле трансляции, есть значительная накладная стоимость, даже если переменной фактически не требуется динамическая инициализация. Если программист может быть уверен, что ни одно использование переменной в модуле трансляции, отличном от модуля определения, не должно вызывать динамическую инициализацию (либо потому, что переменная статически инициализируется, либо потому, что использование переменной в модуле определения будет выполнено до любых использований в другом модуле трансляции), они могут избежать этой накладной стоимости с помощью параметра -fno-extern-tls-init.

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

-ffor-scope
-fno-for-scope

Если указан -ffor-scope, область действия переменных, объявленных в for-init-statement, ограничена самим циклом for, как указано в стандарте C++. Если указан -fno-for-scope, область действия переменных, объявленных в for-init-statement, распространяется до конца окружающего пространства имён, как это было в старых версиях G++ и других (традиционных) реализациях C++.

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

-fno-gnu-keywords

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

-fno-implicit-templates

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

-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 для проблемы Core issue 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 для их отключения.

-frepo

Включить автоматическую инстанциацию шаблонов во время компоновки. Этот параметр также подразумевает -fno-implicit-templates. См. Инстанциацию шаблонов для получения дополнительной информации.

-fno-rtti

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

-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++.

-nostdinc++

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

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

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

Предупреждение, если G++ генерирует код, вероятно, несовместимый с поставщиком-нейтральным C++ ABI. Поскольку G++ теперь по умолчанию обновляет ABI с каждой основной версией, обычно -Wabi будет предупреждать только в том случае, если позже в серии релизов будет добавлена проверка на проблему ABI, обнаруженную после первоначальной версии. -Wabi будет предупреждать о большем количестве вещей, если выбрана более старая версия ABI (с помощью -fabi-version=n).

-Wabi также может использоваться с явным номером версии, чтобы предупреждать о совместимости с определенным уровнем -fabi-version, например, -Wabi=2 для предупреждения о изменениях по отношению к -fabi-version=2.

Хотя были предприняты усилия для предупреждения обо всех таких случаях, вероятно, есть некоторые случаи, о которых не предупреждают, даже если G++ генерирует несовместимый код. Также могут быть случаи, когда предупреждения выдаются, даже если сгенерированный код совместим.

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

Известные несовместимости в -fabi-version=2 (который был по умолчанию от GCC 3.4 до 4.9) включают:

  • Шаблон с параметром шаблона без типа типа ссылки был неправильно замаскирован:
    extern int N;
    template <int &> struct S {};
    void n (S<N>) {2}

    Это было исправлено в -fabi-version=3.

  • Типы векторов SIMD, объявленные с использованием __attribute ((vector_size)) были замаскированы нестандартным способом, который не позволяет перегружать функции, принимающие векторы разных размеров.

    Маскировка была изменена в -fabi-version=4.

  • __attribute ((const)) и noreturn были замаскированы как квалификаторы типа, а decltype обычного объявления было сложено.

    Эти проблемы с маскировкой были исправлены в -fabi-version=5.

  • Ограниченные перечислители, переданные в качестве аргументов в функцию с переменным числом аргументов, повышаются как неограниченные перечислители, что приводит к va_arg к жалобе. На большинстве целевых платформ это фактически не влияет на параметр передачи ABI, поскольку нет способа передать аргумент меньше int.

    Также ABI изменила маскировку пакетов аргументов шаблона, const_cast, static_cast, префиксного инкремента/декремента и функции области класса, используемой в качестве аргумента шаблона.

    Эти проблемы были исправлены в -fabi-version=6.

  • Лямбда-выражения в области по умолчанию аргумента были неправильно замаскированы, и ABI изменила маскировку nullptr_t.

    Эти проблемы были исправлены в -fabi-version=7.

  • При маскировке типа функции с квалификаторами функции, неквалифицированный тип функции неправильно рассматривался как кандидат на подстановку.

    Это было исправлено в -fabi-version=8, значение по умолчанию для GCC 5.1.

  • decltype(nullptr) неправильно имел выравнивание 1, что приводило к доступу без выравнивания. Обратите внимание, что это не повлияло на ABI функции с параметром nullptr_t, так как параметры имеют минимальное выравнивание.

    Это было исправлено в -fabi-version=9, значение по умолчанию для GCC 5.2.

  • Целевые атрибуты, которые влияют на идентификатор типа, такие как вызовы IA32 на тип функции (stdcall, regparm и т. д.), не влияли на замаскированное имя, что приводило к конфликтам имен, когда указатели на функции использовались как аргументы шаблонов.

    Это было исправлено в -fabi-version=10, значение по умолчанию для GCC 6.1.

Также предупреждает об изменениях, связанных с psABI. Известные изменения psABI на данный момент включают:

  • Для SysV/x86-64 объединения с long double членами передаются в памяти, как указано в psABI. Например:
    union U {
      long double ld;
      int i;
    };

    union U всегда передается в памяти.

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

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

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

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

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

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

-Wliteral-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 рассматривается как отдельный токен препроцессора.

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

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

-Wlto-type-mismatch

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

-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.

-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, ...).

Следующие опции -W… не влияют на -Wall.

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

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

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

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

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

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

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

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

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

-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);
};

версия функции f в классе A скрыта в 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. Также можно инстанциировать или специализировать шаблоны.

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

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

-Wvirtual-inheritance

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

-Wnamespaces

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

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

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

Далее: Параметры диалекта 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-8.5.0/gcc/C_002b_002b-Dialect-Options.html

Spec-Zone.ru

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