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/