Why does C++ disallow anonymous structs?
Solution 1:
As others have pointed out anonymous unions are permitted in standard C++, but anonymous structs are not.
The reason for this is that C supports anonymous unions but not anonymous structs*, so C++ supports the former for compatibility but not the latter because it's not needed for compatibility.
Furthermore, there's not much use to anonymous structs in C++. The use you demonstrate, to have a struct containing three floats which can be referred to either by .v[i]
, or .x
, .y
, and .z
, I believe results in undefined behavior in C++. C++ does not allow you to write to one member of a union, say .v[1]
, and then read from another member, say .y
. Although code that does this is not uncommon it is not actually well defined.
C++'s facilities for user-defined types provide alternative solutions. For example:
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 apparently adds anonymous structs, so a future revision to C++ may add them.
Solution 2:
I'll say, you can clean up your vector3
declaration by just using a union
union vector3 {
struct { float x, y, z; } ;
float v[3] ;
} ;
Sure, anonymous structures was an MSVC extension. But ISO C11 permits it now, and gcc allows it, and so does Apple's llvm compiler.
Why in C11 and not C++11? I'm not sure, but practically speaking most (gcc++, MSVC++ and Apple's C++ compiler) C++ compilers support them.
Solution 3:
Not sure what you mean. Section 9.5 of the C++ spec, clause 2:
A union of the form
union { member-specification } ;
is called an anonymous union; it defines an unnamed object of unnamed type.
You can do things like this too:
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 };
}
Not always very useful... although sometimes useful in nasty macro definitions.