根据 gcc 9.1.0 源代码(grepped for flag_ms_extensions
),效果是:
using foo = int; struct A { foo foo; }
)。禁用 ms-extensions 后,行为是在 C 中接受此代码(在合法的地方);或者一个extern "C"
块,除非-pedantic
给出了标志。对此的错误消息是declaration of NAME changes meaning of NAME
。ISO C++ forbids declaration of NAME with no type
现在允许产生诊断的任何情况,int
假设为类型。示例:const *p;
或const f();
。&
操作符需要执行该转换。&f
形成一个指向成员的指针,如果f
(一个不合格的 id)在那个上下文中命名一个非重载的成员函数。ISO C++ 要求使用类名进行显式限定。如果目标 ABI 是 Microsoft ABI,则该标志默认打开。可以通过手动指定来禁用它-fno-ms-extensions
。
接受 Microsoft 头文件中使用的一些非标准结构。
禁用有关 MFC 中使用的构造的 Wpedantic 警告。
所以我假设基本原理是允许 g++ 构建依赖于 MSVC 供应商提供的标头中的非标准代码的MFC应用程序。
我不确定它在 2019 年的相关性如何,我认为可以为 gcc 默认关闭此标志提供一个很好的案例。(如果用户想构建一个旧的 MFC 应用程序,他们总是可以指定它)。
例如,MSVC 19.xx(迄今为止的最新版本)在其默认模式下不再允许最后三个项目符号点。(foo foo;
即使有/Za
标志,它仍然允许)。