Spec-Zone.ru › GCC 5

3.5 Параметры управления диалектом C++

В этом разделе описаны параметры командной строки, имеющие смысл только для программ на C++. Вы также можете использовать большинство параметров компилятора GNU независимо от языка вашей программы. Например, вы можете скомпилировать файл firstClass.C так:

g++ -g -frepo -O -c firstClass.C

В этом примере только -frepo является параметром, предназначенным только для программ на C++; вы можете использовать другие параметры с любым языком, поддерживаемым GCC.

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

См. также -Wabi.

-fabi-compat-version=n

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

При использовании -fabi-version=0 (по умолчанию) он устанавливается по умолчанию в 2. Если явно выбрана другая версия ABI, он устанавливается по умолчанию в 0.

Версия совместимости также устанавливается с помощью -Wabi=n.

-fno-access-control

Отключить все проверки доступа. Этот переключатель в основном полезен для исправления ошибок в коде контроля доступа.

-fcheck-new

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

-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++ дружественная функция, которая не объявлена в окружающей области, может быть найдена только с использованием зависимого от аргументов поиска. GCC по умолчанию использует стандартное поведение.

Этот параметр предназначен для совместимости и может быть удален в будущей версии 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__ вместо него. -ansi подразумевает -fno-gnu-keywords.

-fno-implicit-templates

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

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

-fstats

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

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

  1. Он устанавливает видимость по умолчанию в hidden, как -fvisibility=hidden.
  2. Типы, но не их члены, не скрываются по умолчанию.
  3. Правило одной дефиниции ослаблено для типов без явных указаний видимости, которые определены в более чем одном разделяемом объекте: эти объявления разрешены, если они разрешены, когда этот параметр не используется.

В новом коде лучше использовать -fvisibility=hidden и экспортировать те классы, которые должны быть внешне видимыми. К сожалению, код может полагаться, возможно случайно, на поведение Visual Studio.

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

-fvtable-verify=[std|preinit|none]

Включить (или выключить, если используется -fvtable-verify=none) функцию безопасности, которая проверяет во время выполнения для каждого виртуального вызова, что указатель vtable, через который выполняется вызов, действителен для типа объекта и не поврежден или перезаписан. Если обнаруживается недействительный указатель vtable во время выполнения, сообщается об ошибке, и выполнение программы немедленно прекращается.

Этот параметр вызывает построение структур данных во время выполнения при запуске программы, которые используются для проверки указателей vtable. Параметры «std» и «preinit» контролируют время построения этих структур данных. В обоих случаях структуры данных строятся до достижения выполнения main. Использование -fvtable-verify=std приводит к построению структур данных после загрузки и инициализации разделяемых библиотек. -fvtable-verify=preinit вызывает их построение до загрузки и инициализации разделяемых библиотек.

Если этот параметр появляется несколько раз в командной строке с указанными различными значениями, «none» имеет наивысший приоритет по отношению к «std» и «preinit»; «preinit» имеет приоритет над «std».

-fvtv-debug

При использовании совместно с -fvtable-verify=std или -fvtable-verify=preinit вызывает вызов отладочных версий служебных программ времени выполнения для функции проверки vtable. Этот флаг также заставляет компилятор регистрировать информацию о том, какие указатели vtable он находит для каждого класса. Эта информация записывается в файл с именем vtv_set_ptr_data.log в каталоге, указанном переменной среды VTV_LOGS_DIR, если она определена, или в текущем рабочем каталоге в противном случае.

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

-fvtv-counts

Это отладочный флаг. При использовании совместно с -fvtable-verify=std или -fvtable-verify=preinit это заставляет компилятор отслеживать общее количество виртуальных вызовов, которые он обнаруживает, и количество проверок, которые он вставляет. Он также подсчитывает количество вызовов определенных функций библиотеки времени выполнения, которые он вставляет, и регистрирует эту информацию для каждого модуля компиляции. Компилятор записывает эту информацию в файл с именем vtv_count_data.log в каталоге, указанном переменной среды VTV_LOGS_DIR, если она определена, или в текущем рабочем каталоге в противном случае. Он также подсчитывает размер наборов указателей vtable для каждого класса и записывает эту информацию в vtv_class_set_sizes.log в том же каталоге.

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

-fno-weak

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

-nostdinc++

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

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

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

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

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

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

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

Известные несовместимости в -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.

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

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

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

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

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

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

Также выдаётся предупреждение об изменениях, связанных с 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 обрабатывается как отдельный токен предварительной обработки.

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

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

Выдавать предупреждение, когда возникает сужающее преобразование, запрещённое 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-выражение оценивается как ложь из-за вызова функции, у которой нет спецификации исключений без броска (т. е. 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++:

  • Определять конструктор копирования и оператор присваивания для классов с динамически выделенной памятью.
  • Предпочитать инициализацию присваиванию в конструкторах.
  • Оператор 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)

Отключить предупреждения, когда нешаблонные дружественные функции объявляются в шаблоне. С появлением поддержки явного указания шаблонов в G++, если имя друга является unqualified-id (т. е. ‘friend foo(int)’), спецификация языка C++ требует, чтобы друг объявлял или определял обычную, нешаблонную функцию. (Раздел 14.5.3). До реализации явного указания шаблонов в G++, unqualified-ids могли интерпретироваться как конкретная специализация шаблонной функции. Поскольку такое несоответствующее поведение больше не является по умолчанию в G++, -Wnon-template-friend позволяет компилятору проверять существующий код на потенциальные проблемы и включён по умолчанию. Это новое поведение компилятора можно отключить с помощью -Wno-non-template-friend, что сохранит совместимый код компилятора, но отключит полезное предупреждение.

-Wold-style-cast (C++ and Objective-C++ only)

Предупреждать, если используется старый (стиль C) cast на тип, отличный от void, в программе C++. Новые типы cast (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++ пытались сохранить беззнаковость, но стандарт предписывает текущее поведение.

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

Spec-Zone.ru

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