Что флаг ms-extensions делает именно с gcc? - PullRequest
3 голосов
/ 12 июня 2019

GCC имеет флаг -fms-extensions.

Что именно делает этот флаг? Почему иногда он включен по умолчанию и почему он существует?

1 Ответ

3 голосов
/ 12 июня 2019

В соответствии с исходным кодом 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).

...