3.5 Параметры управления диалектом C++
В этом разделе описываются параметры командной строки, имеющие смысл только для программ на C++. Вы также можете использовать большинство параметров компилятора GNU независимо от языка вашей программы. Например, вы можете скомпилировать файл firstClass.C следующим образом:
g++ -g -fstrict-enums -O -c firstClass.C
В этом примере только -fstrict-enums является параметром, предназначенным только для программ на C++; вы можете использовать другие параметры с любым языком, поддерживаемым GCC.
Некоторые параметры для компиляции программ на C, такие как -std, также актуальны для программ на C++. См. Параметры управления диалектом C.
Вот список параметров, исключительно для компиляции программ на C++:
-fabi-version=n-
Используйте версию n C++ ABI. По умолчанию используется версия 0.
Версия 0 соответствует версии C++ ABI, максимально близкой к спецификации. Поэтому ABI, полученная с помощью версии 0, будет меняться в разных версиях G++, по мере исправления ошибок ABI.
Версия 1 — это версия C++ ABI, впервые появившаяся в G++ 3.2.
Версия 2 — это версия C++ ABI, впервые появившаяся в G++ 3.4 и являвшаяся стандартной до G++ 4.9.
Версия 3 исправляет ошибку при манглинге постоянного адреса как аргумента шаблона.
Версия 4, появившаяся впервые в G++ 4.5, реализует стандартный манглинг для типов векторов.
Версия 5, появившаяся впервые в G++ 4.6, исправляет манглинг атрибутов const/volatile для типов указателей на функции, decltype простого decl и использование параметра функции в объявлении другого параметра.
Версия 6, появившаяся впервые в G++ 4.7, исправляет поведение повышения C++11 перечисленных перечислений области видимости и манглинг наборов аргументов шаблонов, const/static_cast, префикс ++ и –, а также функцию области класса, используемую в качестве аргумента шаблона.
Версия 7, появившаяся впервые в G++ 4.8, обрабатывает nullptr_t как встроенный тип и исправляет манглинг лямбда-выражений в области аргументов по умолчанию.
Версия 8, появившаяся впервые в G++ 4.9, исправляет поведение подстановки типов функций с квалификаторами функций.
Версия 9, появившаяся впервые в G++ 5.2, исправляет выравнивание
nullptr_t.Версия 10, появившаяся впервые в G++ 6.1, добавляет манглинг атрибутов, которые влияют на идентичность типа, таких как атрибуты вызова ia32 (например, ‘stdcall’).
См. также -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-
Отключить всю проверку доступа. Этот переключатель в основном полезен для исправления ошибок в коде проверки доступа.
-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-
Установите максимальную глубину вложенного вычисления для функций C++11 constexpr в n. Предел необходим для обнаружения бесконечной рекурсии во время вычисления константного выражения. Минимальное значение, заданное стандартом, составляет 512.
-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++ по умолчанию использует стандартное поведение.
Этот параметр предназначен для совместимости и может быть удален в будущей версии G++.
-fno-elide-constructors-
Стандарт C++ позволяет реализации пропускать создание временного объекта, используемого только для инициализации другого объекта того же типа. Задание этого параметра отключает эту оптимизацию и принуждает G++ вызывать конструктор копирования во всех случаях.
-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-
Никогда не генерировать код для нелинейных шаблонов, которые подставляются неявно (т.е. при использовании); генерировать код только для явных подстановок. См. Template Instantiation для получения дополнительной информации.
-fno-implicit-inline-templates-
Не генерировать код для неявных подстановок инлайновых шаблонов. По умолчанию инлайны обрабатываются иначе, чтобы компиляции с оптимизацией и без неё требовался один и тот же набор явных подстановок.
-fno-implement-inlines-
Для экономии места не генерировать внестрочные копии инлайновых функций, управляемые
#pragma implementation. Это приведёт к ошибкам линковщика, если эти функции не встроены во всех местах вызова. -fms-extensions-
Отключить предупреждения Wpedantic о конструкциях, используемых в MFC, таких как неявное int и получение указателя на функцию члена через нестандартный синтаксис.
-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++; в основном, значение, которое может быть представлено в минимальном количестве битов, необходимых для представления всех перечислителей). Это предположение может быть неверным, если программа использует преобразование для преобразования произвольного целого значения в перечислимый тип.
-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++ генерирует код, который, вероятно, несовместим с нейтральным по отношению к поставщику ABI C++. Поскольку 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. Включено по умолчанию.
-Wnarrowing (C++ and Objective-C++ only)-
При -std=gnu++98 или -std=c++98, предупреждать о сужающем преобразовании, запрещенном C++11, которое происходит в пределах ‘{ }’, например:
int i = { 2.2 }; // error: narrowing from double to intЭтот флаг включен в -Wall и -Wc++11-compat.
Когда действует более поздний стандарт, например, при использовании -std=c++11, сужающие преобразования диагностируются по умолчанию, как требуется стандартом. Сужающее преобразование от константы приводит к ошибке, а сужающее преобразование от неконстанты приводит к предупреждению, но -Wno-narrowing подавляет диагностику. Обратите внимание, что это не влияет на смысл корректного кода; сужающие преобразования по-прежнему считаются некорректными в контекстах SFINAE.
-Wnoexcept (C++ and Objective-C++ only)-
Предупреждать, когда noexcept-выражение вычисляется как false из-за вызова функции, у которой нет спецификации небросающих исключений (т. е.
throw()илиnoexcept) но компилятор знает, что она никогда не бросит исключение. -Wnon-virtual-dtor (C++ and Objective-C++ only)-
Выдавать предупреждение, когда класс имеет виртуальные функции и доступный не виртуальный деструктор сам по себе или в доступном полиморфном базовом классе, в этом случае возможно, но небезопасно удалять экземпляр производного класса через указатель на сам класс или базовый класс. Это предупреждение автоматически включается, если указан -Weffc++.
-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++»:
- Определять конструктор копирования и оператор присваивания для классов с динамически выделенной памятью.
- Предпочитать инициализацию присваиванию в конструкторах.
- Возвращать ссылку на
*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)-
Отключать предупреждения, когда нешаблонные дружественные функции объявляются внутри шаблона. С появлением поддержки явного указания шаблонов в G++, если имя дружественной функции является неквалифицированным идентификатором (т.е., ‘friend foo(int)’), спецификация языка C++ требует, чтобы дружественная функция объявляла или определяла обычную, нешаблонную функцию. (Раздел 14.5.3). До реализации явного указания шаблонов в G++, неквалифицированные идентификаторы могли интерпретироваться как конкретная специализация шаблонной функции. Поскольку это несоответствующее поведение больше не является стандартным в G++, -Wnon-template-friend позволяет компилятору проверять существующий код на наличие потенциальных проблем и включено по умолчанию. Это новое поведение компилятора может быть выключено с помощью -Wno-non-template-friend, что сохраняет конформный код компилятора, но отключает полезное предупреждение.
-Wold-style-cast (C++ and Objective-C++ only)-
Предупреждать, если в программе C++ используется старое (стиль C) приведение типов к типу, отличном от void. Новые приведения типов (
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-6.5.0/gcc/C_002b_002b-Dialect-Options.html