GCC具有标志-fms-extensions
。
此标志的作用是什么?为什么有时默认情况下启用它,为什么它存在?
答案 0 :(得分:3)
根据gcc 9.1.0源代码(为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
(非限定ID)在该上下文中命名非重载成员函数,则允许f
形成指向成员的指针。 ISO C ++要求使用类名进行显式限定。如果目标ABI是Microsoft ABI,则默认情况下该标志为打开状态。可以通过手动指定-fno-ms-extensions
来禁用它。
背后的理由是一个更棘手的问题。 documentation has说:
接受Microsoft标头文件中使用的一些非标准构造。
禁用有关MFC中使用的构造的Wpedantic警告。
因此,我认为其基本原理是允许g ++构建依赖MSVC供应商提供的标头中的非标准代码的MFC应用程序。
我不确定在2019年这仍然有多重要,我认为gcc可以默认关闭此标志是一个很好的例子。 (如果用户要构建旧的MFC应用程序,则始终可以指定它)。
例如,MSVC 19.xx(最新版本)在其默认模式下不再允许最后三个项目符号。 (即使使用foo foo;
标志,它仍然允许/Za
。