This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Anonymous structures with constructors.
- From: Jim Tilander <Jim dot Tilander at dice dot se>
- To: "'gcc-help at gcc dot gnu dot org'" <gcc-help at gcc dot gnu dot org>
- Date: Tue, 27 Jan 2004 18:06:43 +0100
- Subject: Anonymous structures with constructors.
Hello all!
I'm having a little bit of difficulties porting some code from windows to
Linux. The windows code currently uses the Microsoft compiler, version 7.1
and the following code compiles just fine there. As I understand it's a
specific MS-extension that allows structures with constructors/destructors
inside unions. Are there any possibility that I could compile this code
unmodified with any gcc-version?
As I understand when MSVC generates code for the Transform class, it doesn't
add calls to any Vector constructors (which makes sense, but can be a
potential source of a bullet through a foot). The vector constructors are
necessary for easy conversions from other types, e.g. tuples of floats and
other hardware specific types.
Regards,
Jim Tilander
--- anonymousstruct.cpp ---
#include <cstdio>
class Vector
{
public:
Vector() {}
Vector( float x_, float y_, float z_ ) {}
public:
union
{
struct
{
float x,y,z;
};
float e[4];
};
};
class Transform
{
public:
Transform() {}
~Transform() {}
public:
union
{
struct
{
Vector xAxis;
Vector yAxis;
Vector zAxis;
Vector translation;
};
struct
{
Vector c[4];
};
float e[16];
};
};
int main( int argc, char* argv[] )
{
{
printf( "Marker\n" );
Transform t;
printf( "%f\n", t.xAxis.x );
}
return 0;
}
--- cut here ---
--- compiler output below ---
Balrog:~/temp> /usr/local/gcc332/bin/g++ -v
Reading specs from
/usr/local/gcc332/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/specs
Configured with: ./configure --prefix=/usr/local/gcc332
Thread model: posix
gcc version 3.3.2
Balrog:~/temp> /usr/local/gcc332/bin/g++ -c -Wall anonymousstruct.cpp
anonymousstruct.cpp:33: error: member Vector Transform::<anonymous
union>::<anonymous struct>::xAxis' with constructor not allowed in
anonymous
aggregate
anonymousstruct.cpp:34: error: member Vector Transform::<anonymous
union>::<anonymous struct>::yAxis' with constructor not allowed in
anonymous
aggregate
anonymousstruct.cpp:35: error: member Vector Transform::<anonymous
union>::<anonymous struct>::zAxis' with constructor not allowed in
anonymous
aggregate
anonymousstruct.cpp:36: error: member Vector Transform::<anonymous
union>::<anonymous struct>::translation' with constructor not allowed in
anonymous aggregate
anonymousstruct.cpp:33: error: member `Vector Transform::<anonymous
union>::<anonymous struct>::xAxis' with constructor not allowed in union
anonymousstruct.cpp:34: error: member `Vector Transform::<anonymous
union>::<anonymous struct>::yAxis' with constructor not allowed in union
anonymousstruct.cpp:35: error: member `Vector Transform::<anonymous
union>::<anonymous struct>::zAxis' with constructor not allowed in union
anonymousstruct.cpp:36: error: member `Vector Transform::<anonymous
union>::<anonymous struct>::translation' with constructor not allowed in
union
anonymousstruct.cpp:41: error: member `Vector Transform::<anonymous
union>::<anonymous struct>::c[4]' with constructor not allowed in union