GCC有一个标志-fms-extensions
。
这个标志具体是做什么的?为什么它有时默认开启,为什么它存在?
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();
。-fno-ms-extensions
来禁用它。
因此,我认为理由是允许 g++ 构建依赖于 MSVC 供应商提供的头文件中的非标准代码的 MFC 应用程序。接受 Microsoft 头文件中使用的一些非标准结构。
禁用 MFC 中使用的结构的 Wpedantic 警告。
foo foo;
)。
-ms-extensions
启用的功能不是标准的“匿名结构体和联合体”。标准的匿名结构体和联合体只允许嵌套的无标签结构体/联合体声明引入一个未命名的字段。另一方面,这个扩展允许带标签的结构体/联合体声明引入一个未命名的字段。它还允许使用先前声明的结构体/联合体类型来实现这个目的(带标签或typedef)。这与标准功能相比非常不同,而且功能范围更广。 - AnT stands with Russia