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

标签 c++ c windows gcc mingw

GCC 有一个标志 -fms-extensions

这个标志到底是做什么的?为什么它有时默认打开,它为什么存在?

最佳答案

根据 gcc 9.1.0 源代码(grepped for flag_ms_extensions),效果是:

  • (C)​​ 允许 Microsoft 版本的匿名 union 和结构。这包括对 C11 anonymous unions and structs 的支持以及Microsoft-specific flavours ,包括完全省略大括号成员列表,以及将成员放置在父 namespace 中,即使结构/union 具有标识符也是如此。
  • (C++) 允许类成员与其类型同名(例如,using foo = int; struct A { foo foo; })。在禁用 ms-extensions 的情况下,行为是在 C 中接受此代码(在合法的地方);或 extern "C" block ,除非给出了 -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 形成指向成员的指针,如果 f(一个非限定 ID)在该上下文中命名一个非重载成员函数。 ISO C++ 要求使用类名进行显式限定。

如果目标 ABI 是 Microsoft ABI,则该标志默认打开。可以通过手动指定 -fno-ms-extensions 来禁用它。


这背后的基本原理是一个更棘手的问题。 documentation has说:

Accept some non-standard constructs used in Microsoft header files.

Disable Wpedantic warnings about constructs used in MFC.

所以我假设基本原理是允许 g++ 构建 MFC依赖于 MSVC 供应商提供的 header 中的非标准代码的应用程序。

我不确定它在 2019 年的相关性如何,我认为 gcc 可以默认关闭此标志。 (如果用户想要构建旧的 MFC 应用程序,他们可以随时指定它)。

例如 MSVC 19.xx(迄今为止的最新版本)在其默认模式下不再允许最后三个要点。 (即使使用 /Za 标志,它仍然允许 foo foo;)。

关于c++ - ms-extensions 标志对 gcc 有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56554567/

相关文章:

c++ - 错误:创建对象后无法分配区域

c++ - 在类中初始化字段的原因是什么?

c++ - 修改自制的 concat 函数,使其接受两个以上的参数

windows - 如何使用 Phonegap/Cordova/WinJS/HTML/CSS/JS 在 Windows Phone 8.1 中扫描二维码?

windows - 在 Windows 上链接到 libjpeg 时如何解析 "undefined reference"?

c++ - 返回指向在不同线程中更新的 QML 的 C++ 指针

c++ - eclipse 的 MinGW 替代品

c - C语言中的[数组名]是什么意思?

c - numaif.h : MPOL_LOCAL undeclared for use in mbind

windows - 使用 ShellExecuteEx 启动外部应用程序并等待其初始化