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:
- Он устанавливает значение видимости по умолчанию на
hidden, как -fvisibility=hidden. - Типы, но не их члены, не скрываются по умолчанию.
- Правило одной дефиниции ослаблено для типов без явных параметров видимости, которые определены в нескольких общих объектах: эти объявления разрешены, если они разрешены, когда этот параметр не используется.
В новом коде лучше использовать -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