ms-extensions标志对gcc有什么作用?

时间:2019-06-12 04:12:01

标签: c++ c windows gcc mingw

GCC具有标志-fms-extensions

此标志的作用是什么?为什么有时默认情况下启用它,为什么它存在?

1 个答案:

答案 0 :(得分:3)

根据gcc 9.1.0源代码(为flag_ms_extensions提供),效果如下:

  • (C)允许anonymous unions and structs。这些已添加到C11标准中,但即使在较旧的模式下(例如C99或Ansi),该标志也将启用它们。
  • (C ++)允许类成员与其类型使用相同的名称(例如using foo = int; struct A { foo foo; })。禁用ms-extensions后,行为是在C语言中接受此代码(合法);或extern "C"块,除非给出了-pedantic标志。错误消息为declaration of NAME changes meaning of NAME
  • (C ++)允许隐式int ;现在允许使用任何可能产生诊断ISO C++ forbids declaration of NAME with no type的情况,并假设int为类型。例如:const *p;const f();
  • (C ++)允许从命名为非静态成员函数的 qualified-id 隐式转换为指向成员的指针。在ISO C ++中,&运算符是执行该转换所必需的。
  • (C ++)如果&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