繁体   English   中英

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

[英]What does the ms-extensions flag do exactly with gcc?

GCC 有一个标志-fms-extensions

这个标志究竟有什么作用? 为什么它有时默认开启,为什么它存在?

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

  • (C) 允许 Microsoft 版本的匿名联合和结构。 这包括对C11 匿名联合和结构以及Microsoft 特定风格的支持,包括完全省略大括号成员列表,并将成员放置在父命名空间中,即使结构/联合具有标识符。
  • (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情况,并假定ISO C++ forbids declaration of NAME with no typeint 示例: const *p; const f(); .
  • (C++) 允许从命名非静态成员函数的限定 id隐式转换为指向成员的指针。 在 ISO C++ 中,需要&运算符来执行该转换。
  • (C++) 允许&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标志)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM