一些C ++编译器允许匿名联合和结构的一个扩展标准C ++。 这是一个有点语法糖这是偶尔非常有帮助。
那是什么防止这种作为标准的一部分的理由? 有没有技术障碍? 的哲学吗? 还是远远不够的,需要理由吗?
下面是我在谈论的一个样本:
struct vector3 {
union {
struct {
float x;
float y;
float z;
};
float v[3];
};
};
我的编译器会接受这一点,但它警告说, “无名结构/联合”是一个非标准扩展到C ++ 。
正如其他人所指出的匿名工会被允许在标准C ++,但匿名结构都没有。
这样做的原因是,C支持匿名联合而不是匿名结构*,所以C ++支持在前兼容性而不是后者,因为它是没有必要的兼容性。
此外,没有太多的使用在C ++匿名结构。 你演示的用途,为具有含有三个浮筒可通过被称为或是结构.v[i]
或.x
, .y
和.z
,相信在未定义的行为结果在C ++中。 C ++不允许你写一个工会的成员之一,说.v[1]
然后从另一个成员读,说.y
。 虽然代码,不会这并不鲜见它实际上没有很好的界定。
C ++的用于用户定义类型的设施提供替代解决方案。 例如:
struct vector3 {
float v[3];
float &operator[] (int i) { return v[i]; }
float &x() { return v[0]; }
float &y() { return v[1]; }
float &z() { return v[2]; }
};
* C11显然增加了匿名结构,所以C ++未来版本可能会增加他们。
我会说,你可以清理你vector3
通过只使用一个声明union
union vector3 {
struct { float x, y, z; } ;
float v[3] ;
} ;
当然, 匿名结构是一个MSVC扩展 。 但ISO C11现在允许它, GCC允许它 ,所以做苹果的LLVM编译器。
为什么C11,而不是C ++ 11? 我不知道,但实际而言最(GCC ++,MSVC ++和苹果的C ++编译器)C ++编译器支持他们。
不明白你的意思。 在C ++规范的第9.5节,第2:
形式的联合
union { member-specification } ;
被称为匿名联合; 它定义无名类型的未命名的对象。
你可以这样做太的东西:
void foo()
{
typedef
struct { // unnamed, is that what you mean by anonymous?
int a;
char b;
} MyStructType; // this is more of a "C" style, but valid C++ nonetheless
struct { // an anonymous struct, not even typedef'd
double x;
double y;
} point = { 1.0, 3.4 };
}
并不总是非常有用的...虽然讨厌的宏定义有时是有用的。
工会可以是匿名的; 看到标准,9.5条第2款。
目的是什么,你看到一个匿名的结构或类为履行? 猜测为什么有些东西是不能在标准之前,我想有一些想法,为什么是的,我没有看到一个匿名结构的用途。
基于编辑,注释,这MSDN文章: 匿名结构 ,我会大胆地猜测-这与封装的概念很差适合。 我不希望一个类的成员与我的类的命名空间的混乱超出了仅仅增加一个成员。 此外,更改匿名结构可以影响我的课,而不会允许。
您的代码
union {
struct {
float x;
float y;
float z;
};
float v[3];
};
就好像
union Foo {
int;
float v[3];
};
这是肯定无效的(在C99和之前)。
究其原因可能是简化解析(C语言),因为在这种情况下,你只需要检查的结构/联合体只有“声明符声明”之类
Type field;
这就是说, gcc和“其他编译器”支持无名领域的延伸。
编辑:匿名结构现在正式在C11支持(§6.7.2.1/ 13)。