一些C++编译器允许匿名联合和结构作为标准C++的扩展.这有点语法糖,偶尔会非常有帮助.
阻止它成为标准一部分的理由是什么?是否存在技术障碍?一个哲学的?或者仅仅是不足以证明它的合理性?
这是我正在谈论的样本:
struct vector3 {
union {
struct {
float x;
float y;
float z;
};
float v[3];
};
};
Run Code Online (Sandbox Code Playgroud)
我的编译器会接受这个,但它警告"无名结构/联合"是C++的非标准扩展.
我可以用c ++/g ++做到这一点:
struct vec3 {
union {
struct {
float x, y, z;
};
float xyz[3];
};
};
Run Code Online (Sandbox Code Playgroud)
然后,
vec3 v;
assert(&v.xyz[0] == &v.x);
assert(&v.xyz[1] == &v.y);
assert(&v.xyz[2] == &v.z);
Run Code Online (Sandbox Code Playgroud)
将工作.
如何使用gcc在c中执行此操作?我有
typedef struct {
union {
struct {
float x, y, z;
};
float xyz[3];
};
} Vector3;
Run Code Online (Sandbox Code Playgroud)
但我特别是周围都有错误
line 5: warning: declaration does not declare anything
line 7: warning: declaration does not declare anything
Run Code Online (Sandbox Code Playgroud) MSDN 认为匿名结构在C++中是非标准的:
Microsoft C扩展允许您在另一个结构中声明结构变量而不为其指定名称.这些嵌套结构称为匿名结构.C++不允许匿名结构.
您可以访问匿名结构的成员,就好像它们是包含结构中的成员一样.
我被告知这个功能不一定只是创建一个未命名的结构,但我不能看到标准措辞的区别.
C++ 11说:
[C++11: 9/1]:[..]一个类说明符,其类头省略了class-head-name,定义了一个未命名的类.
并为缺少名称的类型定义提供完整的语法结构.
C++ 03缺少这种明确的措辞,但同样表明identifier类型定义中的类型是可选的,并在9.4.2/5和中引用了"未命名的类" 3.5/4.
这是一个后续问题.
在上一个问题中,@ JohannesSchaub-litb表示以下代码不完全符合标准:
class { int i; }; //unnamed-class definition. § 9/1 allows this!
Run Code Online (Sandbox Code Playgroud)
然后他补充道,
虽然它在语法上是有效的,但它违反了这样一个规则,即这样的类必须在其封闭范围内声明至少一个名称.
我真的不明白这一点.他在说什么名字?
任何人都可以进一步详细说明(最好引用标准)?