3.5 Параметры, управляющие диалектом C++
В этом разделе описаны параметры командной строки, имеющие смысл только для программ на C++. Также вы можете использовать большинство опций компилятора GNU независимо от языка вашей программы. Например, вы можете скомпилировать файл firstClass.C следующим образом:
g++ -g -frepo -O -c firstClass.C
В этом примере только -frepo является опцией, предназначенной только для программ на C++; вы можете использовать другие опции с любым языком, поддерживаемым GCC.
Вот список опций, только для компиляции программ на C++:
-
-fabi-version=n - Использовать версию n C++ ABI. По умолчанию используется версия 2.
Версия 0 соответствует версии C++ ABI, наиболее точно следующей спецификации C++ ABI. Следовательно, ABI, полученная с помощью версии 0, будет изменяться в разных версиях G++, по мере исправления ошибок ABI.
Версия 1 — это версия C++ ABI, впервые появившаяся в G++ 3.2.
Версия 2 — это версия C++ ABI, впервые появившаяся в G++ 3.4.
Версия 3 исправляет ошибку при обработке константного адреса как аргумента шаблона.
Версия 4, впервые появившаяся в G++ 4.5, реализует стандартную обработку векторизованных типов.
Версия 5, впервые появившаяся в G++ 4.6, исправляет обработку атрибутов const/volatile для типов указателей на функции, decltype простого decl и использование параметра функции в объявлении другого параметра.
См. также
-Wabi. -fno-access-control- Отключить всю проверку доступа. Этот ключ в основном полезен для решения проблем в коде проверки доступа.
-fcheck-new- Проверить, что указатель, возвращаемый
operator new, не равен null, прежде чем пытаться изменить выделенную память. Эта проверка обычно не нужна, так как стандарт 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++ дружественные функции документированы как работающие таким образом, и версии G++ до 4.1 всегда работали таким образом. Однако в ISO C++ дружественная функция, которая не объявлена в окружающем пространстве имен, может быть найдена только с помощью зависимого от аргументов поиска. Этот ключ вызывает вставку функций-друзей так, как это было в предыдущих версиях.
Этот ключ предназначен для совместимости и может быть удалён в будущих выпусках 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’ иметь динамическую (runtime) инициализацию. Для поддержки этого любое использование такой переменной проходит через функцию-обёртку, которая выполняет необходимую инициализацию. Когда использование и определение переменной находятся в одном модуле трансляции, эта накладные расходы могут быть оптимизированы, но когда использование находится в другом модуле трансляции, есть значительные накладные расходы даже если переменная фактически не нуждается в динамической инициализации. Если программист может быть уверен, что никакое использование переменной в модуле, отличном от модуля определения (non-defining TU), не должно инициировать динамическую инициализацию (либо потому, что переменная статически инициализирована, либо потому, что использование переменной в модуле определения будет выполнено до любых использований в другом модуле), они могут избежать этих накладных расходов с помощью ключа-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спецификацию, чтобы уменьшить или устранить накладные расходы текста по сравнению с функцией без спецификации исключений. Если у функции есть локальные переменные типов с нетривиальными деструкторами, спецификация исключений фактически уменьшает размер функции, потому что обработка исключений для этих переменных может быть оптимизирована. Семантический эффект заключается в том, что исключение, брошенное из функции с такой спецификацией исключений, приводит к вызову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 *или к недвусмысленным базовым классам. -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- Этот переключатель объявляет, что пользователь не пытается сравнить указатели на встроенные функции или методы, где адреса двух функций взяты в разных общих объектах.
Поведение этого переключателя немного отличается от непосредственного маркирования методов как скрытых, потому что оно не влияет на статические переменные, локальные для функции, или не заставляет компилятор заключить, что функция определена только в одном общем объекте.
Вы можете явно указать видимость метода, чтобы отменить действие переключателя для данного метода. Например, если вы хотите сравнить указатели на определенный встроенный метод, вы можете отметить его как имеющего видимость по умолчанию. Отмечание содержащего класса явной видимостью не имеет эффекта.
Явно инстанцированные встроенные методы не затронуты этим параметром, так как их связь может в противном случае пересекать границу общей библиотеки. См. Инстанцирование шаблонов.
-fvisibility-ms-compat- Этот флаг пытается использовать параметры видимости, чтобы сделать модель связи C++ GCC совместимой с моделью Microsoft Visual Studio.
Флаг вносит следующие изменения в модель связи GCC:
- Он устанавливает видимость по умолчанию в
hidden, как-fvisibility=hidden. - Типы, но не их члены, не скрываются по умолчанию.
- Правило одной декларации ослаблено для типов без явных параметров видимости, которые определены более чем в одном общем объекте: эти объявления разрешены, если они разрешены, когда этот параметр не используется.
В новом коде лучше использовать
-fvisibility=hiddenи экспортировать те классы, которые должны быть внешне видимыми. К сожалению, код может полагаться, возможно, случайно, на поведение Visual Studio.Среди последствий этих изменений — то, что статические члены данных одного типа с одинаковым именем, но определенные в разных общих объектах, различны, так что изменение одного не изменяет другое; и что указатели на члены функций, определенные в разных общих объектах, могут не сравниваться как равные. Когда этот флаг задан, является нарушением правила одной декларации (ОДР) определять типы с одинаковым именем по-разному.
- Он устанавливает видимость по умолчанию в
-
-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- Вызывает вызов отладочных версий функций выполнения для функции проверки vtable. Предполагается, что используется
-fvtable-verify=stdили-fvtable-verify=preinit. Этот флаг также заставит компилятор отслеживать, какие указатели vtable он нашел для каждого класса, и запишет эту информацию в файл «vtv_set_ptr_data.log» в каталоге сброса файлов на компьютере пользователя.Примечание: эта функция ДОБАВЛЯЕТ данные в файл журнала. Если вам нужен новый файл журнала, обязательно удалите любой существующий.
-fvtv-counts- Это отладочный флаг. При использовании в сочетании с
-fvtable-verify=stdили-fvtable-verify=preinit, это заставляет компилятор отслеживать общее количество виртуальных вызовов, которые он обнаружил, и количество проверок, которые он вставил. Также подсчитывает количество вызовов определенных функций библиотеки выполнения, которые он вставляет. Эта информация для каждой единицы компиляции записывается в файл с именем «vtv_count_data.log» в каталоге dump_file на компьютере пользователя. Также подсчитывает размер наборов указателей vtable для каждого класса и записывает эту информацию в «vtv_class_set_sizes.log» в том же каталоге.Примечание: эта функция ДОБАВЛЯЕТ данные в файлы журнала. Чтобы получить новые файлы журнала, убедитесь, что вы удалили все существующие.
-fno-weak- Не использовать поддержку слабых символов, даже если она предоставляется компоновщиком. По умолчанию G++ использует слабые символы, если они доступны. Этот параметр существует только для тестирования и не должен использоваться конечными пользователями; он приводит к худшему коду и не имеет преимуществ. Этот параметр может быть удален в будущих версиях G++.
-nostdinc++- Не искать заголовочные файлы в стандартных каталогах, специфичных для C++, но все еще искать в других стандартных каталогах. (Этот параметр используется при построении библиотеки C++.)
Кроме того, эти параметры оптимизации, предупреждений и генерации кода имеют смысл только для программ на C++:
-
-Wabi(C, Objective-C, C++ и Objective-C++ только) - Предупреждает, когда G++ генерирует код, вероятно, несовместимый с нейтральной по поставщику ABI C++. Хотя предприняты усилия для предупреждения обо всех таких случаях, вероятно, есть некоторые случаи, о которых не предупреждают, даже если G++ генерирует несовместимый код. Также могут быть случаи, когда предупреждения выдаются, даже если сгенерированный код совместим.
Вы должны переписать свой код, чтобы избежать этих предупреждений, если вас беспокоит тот факт, что код, сгенерированный G++, может не быть бинарно совместим с кодом, сгенерированным другими компиляторами.
Известные несовместимости в
-fabi-version=2(по умолчанию) включают:- Шаблон с параметром шаблона, не являющимся типом, ссылочного типа, имеет неправильное имя:
extern int N; template <int &> struct S {}; void n (S<N>) {2}Это исправлено в
-fabi-version=3. - Типы векторов SIMD, объявленные с использованием
__attribute ((vector_size))имеют нестандартное имя, что не позволяет перегружать функции, принимающие векторы разных размеров.Имя изменено в
-fabi-version=4.
Известные несовместимости в
-fabi-version=1включают:- Неправильная обработка хвостового заполнения для битовых полей. G++ может пытаться упаковать данные в тот же байт, что и базовый класс. Например:
struct A { virtual void f(); int f1 : 1; }; struct B : public A { int f2 : 1; };В этом случае G++ помещает
B::f2в тот же байт, что иA::f1; другие компиляторы — нет. Вы можете избежать этой проблемы, явно добавив заполнениеAтак, чтобы его размер был кратен размеру байта на вашей платформе; это заставляет G++ и другие компиляторы размещатьBодинаково. - Неправильная обработка хвостового заполнения для виртуальных баз. G++ не использует хвостовое заполнение при размещении виртуальных баз. Например:
struct A { virtual void f(); char c1; }; struct B { B(); char c2; }; struct C : public A, public virtual B {};В этом случае G++ не помещает
Bв хвостовое заполнение дляA; другие компиляторы — да. Вы можете избежать этой проблемы, явно добавив заполнениеAтак, чтобы его размер был кратен его выравниванию (без учета виртуальных базовых классов); это заставляет G++ и другие компиляторы размещатьCодинаково. - Неправильная обработка битовых полей с объявленной шириной, большей, чем ширина их базовых типов, когда битовые поля появляются в объединении. Например:
union U { int i : 4096; };Предполагая, что у
intнет 4096 бит, G++ делает объединение слишком маленьким на количество бит вint. - Пустые классы могут размещаться с неправильными смещениями. Например:
struct A {}; struct B { A a; virtual void f (); }; struct C : public B, public A {};G++ помещает базовый класс
AклассаCсо смещением, отличным от нуля; он должен быть размещён со смещением ноль. G++ ошибочно считает, что член данныхAклассаBуже находится со смещением ноль. - Имена шаблонных функций, типы которых включают
typenameили шаблонные шаблонные параметры, могут быть искажены.template <typename Q> void f(typename Q::X) {} template <template <typename> class Q> void f(typename Q<int>::X) {}Инстанциации этих шаблонов могут быть искажены неправильно.
Также предупреждает об изменениях, связанных с psABI. Известные изменения в psABI на данный момент включают:
- Для SysV/x86-64 объединения с членами
long doubleпередаются в памяти в соответствии с psABI. Например:union U { long double ld; int i; };union Uвсегда передаётся в памяти.
- Шаблон с параметром шаблона, не являющимся типом, ссылочного типа, имеет неправильное имя:
-
-Wctor-dtor-privacy(C++ и Objective-C++ только) - Предупреждает, когда класс кажется непригодным для использования, поскольку все конструкторы или деструкторы в этом классе являются закрытыми, и у него нет ни друзей, ни публичных статических членов-функций. Также предупреждает, если нет методов, отличных от закрытых, и есть хотя бы одна закрытая функция-член, которая не является конструктором или деструктором.
-
-Wdelete-non-virtual-dtor(C++ и Objective-C++ только) - Предупреждает, когда «
delete» используется для уничтожения экземпляра класса, имеющего виртуальные функции и невиртуальный деструктор. Небезопасно удалять экземпляр производного класса через указатель на базовый класс, если базовый класс не имеет виртуального деструктора. Это предупреждение включено с помощью-Wall. -
-Wliteral-suffix(C++ и Objective-C++ только) - Предупреждает, когда строковая или символьная константа следуют суффиксом 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++ и Objective-C++ только) - Предупреждает, когда сужение, запрещённое C++11, происходит в «
{ }», напримерint i = { 2.2 }; // error: narrowing from double to intЭтот флаг включен в
-Wallи-Wc++11-compat.С помощью
-std=c++11,-Wno-narrowingподавляет диагностику, требуемую стандартом. Обратите внимание, что это не влияет на смысл корректного кода; сужения по-прежнему считаются некорректными в контексте SFINAE. -
-Wnoexcept(C++ и Objective-C++ только) - Предупреждает, когда выражение noexcept принимает значение false из-за вызова функции, которая не имеет спецификации исключений, не выбрасывающих исключения (т. е. «
throw()» или «noexcept»), но компилятор знает, что она никогда не выбросит исключение. -
-Wnon-virtual-dtor(C++ и Objective-C++ только) - Предупреждает, когда класс имеет виртуальные функции и доступный невиртуальный деструктор в самом классе или в доступном полиморфном базовом классе, в этом случае возможно, но небезопасно, удалять экземпляр производного класса через указатель на сам класс или базовый класс. Это предупреждение автоматически включается, если указан
-Weffc++. -
-Wreorder(C++ и Objective-C++ только) - Предупреждает, когда порядок инициализаторов членов, заданных в коде, не соответствует порядку их выполнения. Например:
struct A { int i; int j; A(): j (0), i (1) { } };Компилятор переупорядочивает инициализаторы членов для «
i» и «j», чтобы соответствовать порядку объявления членов, выведя соответствующее предупреждение. Это предупреждение включается с помощью-Wall. -
-fext-numeric-literals(C++ и Objective-C++ только) - Принимает числовые суффиксы для мнимых, дробных или определённых машиной литералов как расширения GNU. Когда этот параметр выключен, эти суффиксы обрабатываются как пользовательские числовые суффиксы литералов C++11. Он включён по умолчанию для всех диалектов до C++11 и всех диалектов GNU:
-std=c++98,-std=gnu++98,-std=gnu++11,-std=gnu++1y. Этот параметр выключен по умолчанию для ISO C++11 и далее (-std=c++11, ...).
Следующие -W... параметры не затрагиваются -Wall.
-
-Weffc++(Только C++ и Objective-C++) - Предупреждать о нарушениях следующих рекомендаций по стилю из серии книг Скотта Майерса «Effective C++»:
- Определять конструктор копирования и оператор присваивания для классов с динамически выделенной памятью.
- Предпочитать инициализацию присваиванию в конструкторах.
- Использовать
operator=для возврата ссылки на*this. - Не пытаться вернуть ссылку, когда необходимо вернуть объект.
- Различать префиксную и постфиксную формы операторов инкремента и декремента.
- Никогда не перегружать
&&,||, или,.
Этот параметр также включает
-Wnon-virtual-dtor, что также является одной из рекомендаций Effective C++. Однако проверка дополнительно предупреждает об отсутствии виртуального деструктора в доступных неполиморфных базовых классах.При выборе этого параметра помните, что заголовочные файлы стандартной библиотеки не всегда следуют этим рекомендациям; используйте ‘
grep -v’, чтобы отфильтровать такие предупреждения. -
-Wstrict-null-sentinel(Только C++ и Objective-C++) - Предупреждать об использовании не приведенного к типу
NULLв качестве стоп-сигнала. При компиляции только с GCC это допустимый стоп-сигнал, так какNULLопределен как__null. Хотя это константа нулевого указателя, а не нулевой указатель, гарантируется, что она имеет тот же размер, что и указатель. Однако это использование не является переносимым между различными компиляторами. -
-Wno-non-template-friend(Только C++ и Objective-C++) - Отключать предупреждения, когда нешаблонные дружественные функции объявлены внутри шаблона. С появлением поддержки явного указания шаблонов в G++, если имя друга является неквалифицированным идентификатором (т.е., ‘
friend foo(int)’), спецификация языка C++ требует, чтобы друг объявлял или определял обычную нешаблонную функцию. (Раздел 14.5.3). До того, как G++ реализовал явное указание, неквалифицированные идентификаторы могли интерпретироваться как определенная специализация шаблонной функции. Поскольку это несоответствующее поведение больше не является стандартным для G++,-Wnon-template-friendпозволяет компилятору проверять существующий код на потенциальные проблемы и включено по умолчанию. Это новое поведение компилятора можно отключить с помощью-Wno-non-template-friend, что сохраняет конформный компиляционный код, но отключает полезное предупреждение. -
-Wold-style-cast(Только C++ и Objective-C++) - Предупреждать, если используется старое (C-стилевое) приведение типов к типу, отличному от void, в программе на C++. Новые стили приведений типов (‘
dynamic_cast’, ‘static_cast’, ‘reinterpret_cast’, и ‘const_cast’) менее уязвимы к непреднамеренным эффектам и намного проще для поиска. -
-Woverloaded-virtual(Только C++ и Objective-C++) - Предупреждать, когда объявление функции скрывает виртуальные функции из базового класса. Например, в:
struct A { virtual void f(); }; struct B: public A { void f(int); };версия класса
Aфункцииfскрыта вB, и код типа:B* b; b->f();
не может быть скомпилирован.
-
-Wno-pmf-conversions(Только C++ и Objective-C++) - Отключать диагностику при преобразовании связанного указателя на член-функцию в обычный указатель.
-
-Wsign-promo(Только C++ и Objective-C++) - Предупреждать, когда разрешение перегрузки выбирает повышение типа unsigned или enumerated к signed типу, по сравнению с преобразованием к типу unsigned того же размера. Предыдущие версии G++ пытались сохранить unsigned, но стандарт предписывает текущее поведение.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/C_002b_002b-Dialect-Options.html