Spec-Zone.ru › GCC 7

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 перечислений и обработку пакетов аргументов шаблонов, 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.

См. также -Wabi.

-fabi-compat-version=n

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

С -fabi-version=0 (по умолчанию) это по умолчанию 8 (совместимость с GCC 5). Если явно выбран другой номер версии 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).

-fcheck-new

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

-fconcepts

Включить поддержку C++ Extensions for Concepts Technical Specification, 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

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

-fconstexpr-loop-limit=n

Установить максимальное количество итераций цикла для C++14 constexpr функций в 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

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

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

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

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

-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++1z. -fstrong-eval-order=some включает только порядок доступа к членам и сдвигов, и является значением по умолчанию без -std=c++1z.

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

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

-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-выражение вычисляет значение false из-за вызова функции, у которой нет спецификации исключения без выбрасывания (т. е. throw() или noexcept), но компилятор знает, что эта функция никогда не выбросит исключение.

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

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

template <class T> void f(T t) { t(); };
void g() noexcept;
void h() { f(g); } // in C++14 calls f<void(*)()>, in C++1z calls f<void(*)()noexcept>
-Wnon-virtual-dtor (C++ and Objective-C++ only)

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

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

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

-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 в качестве стоп-сигнала. При компиляции только с GCC это допустимый стоп-сигнал, так как 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);
};

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

-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-7.5.0/gcc/C_002b_002b-Dialect-Options.html

Spec-Zone.ru

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