В соответствии с исходным кодом gcc 9.1.0 (для flag_ms_extensions
) приведены следующие эффекты:
- (C) Разрешить анонимные объединения и структуры .Они были добавлены к стандарту C11, но флаг включит их даже в более старых режимах, таких как C99 или Ansi.
- (C ++) Разрешить члену класса иметь то же имя, что и его тип (например,
using foo = int; struct A { foo foo; }
).С отключенными расширениями ms поведение состоит в том, чтобы принять этот код в C (где это допустимо);или блок extern "C"
, если не был указан флаг -pedantic
.Это сообщение об ошибке: declaration of NAME changes meaning of NAME
. - (C ++) Allow implicit int ;любая ситуация, которая вызвала бы диагностику
ISO C++ forbids declaration of NAME with no type
, теперь разрешена, с типом int
.Примеры: const *p;
или const f();
. - (C ++) Разрешить неявное преобразование из qualid-id с именем нестатической функции-члена в указатель на член.В ISO C ++ для выполнения этого преобразования требуется оператор
&
. - (C ++) Разрешить
&f
формировать указатель на член, если f
(безусловный идентификатор) называет неперегруженная функция-член в этом контексте.ISO C ++ требует явной квалификации с именем класса.
Флаг включен по умолчанию, если целевой ABI является Microsoft ABI.Его можно отключить, указав вручную -fno-ms-extensions
.
Смысл этого вопроса сложнее.Документация содержит :
Принимать некоторые нестандартные конструкции, используемые в заголовочных файлах Microsoft.
Отключить предупреждения Wpedantic о конструкцияхиспользуется в MFC.
Поэтому я предполагаю, что логическое обоснование состоит в том, что g ++ может создавать MFC приложений, которые зависят от нестандартного кода в заголовках, поставляемых MSVC.
Я не уверен, насколько уместно это все еще в 2019 году, и я думаю, что можно сделать хороший пример для gcc по умолчанию с отключением этого флага.(Пользователи всегда могут указать его, если они хотят создать старое приложение MFC).
Например, MSVC 19.xx (последняя версия на сегодняшний день) больше не позволяет использовать последние три маркера в режиме по умолчанию.(Он по-прежнему допускает foo foo;
даже с флагом /Za
).