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