#define Offset(M,S) ((&(((S*)1)->M)) - 1)
struct PacketData {
PacketHeader Header;
char* pData;
};
enum HeaderSizes {
PacketDataHeaderSize = Offset( pData, PacketData ),
};
how to make this work in gcc-3.4.5
This is a well known trick of finding out some structure's header size, specially when
the content of the structure might be changed by several programmers.
But apparently this trick doesn't work in >=GCC-3.4.5 anymore, cuz the compiler doesn't allow setting anything other than "constant literals" for enumerations. Hence, last night i had to do the nasty quick fix by making PacketDataHeaderSize a "const int" global variable.
But is there any elegant way to do this in >=GCC-3.4.5 ?
Z
Have you tried searching the headers for the "offsetof" macro? It should be located in "stddef.h".
The C version is slightly different than yours:
That macro formatting might not be preserved.
At any rate, the problem isn't likely to be the macro but how you're using it with the enum.
The C version is slightly different than yours:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)// and the C++ version more different still:#define offsetof(TYPE, MEMBER) (__offsetof__ (reinterpret_cast <size_t> (&reinterpret_cast <const volatile char &>(static_cast<TYPE *> (0)->MEMBER))))
That macro formatting might not be preserved.
At any rate, the problem isn't likely to be the macro but how you're using it with the enum.
"I thought what I'd do was, I'd pretend I was one of those deaf-mutes." - the Laughing Man
goodness me !! that CPP version is kinda complicated !! hehehe... well i was compiling
Torque Engine code in Gentoo (gcc-3.4.5).. and it wouldn't compile the following
As you can see the Torque guys wrote their own Offset macro. Later on i had to declare those
enums as Global constant integer variable. Anyway, the engine gives seg fault in gentoo.. i have no idea why... i remember it ran well in my old mandrake-10 box.
But i really dint know that offsetof macros was already defined in stddef.h !! just wondering why did the Torque guys re-wrote it then !!??
Torque Engine code in Gentoo (gcc-3.4.5).. and it wouldn't compile the following
#ifndef Offset#if defined(TORQUE_COMPILER_GCC) && (__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1))#define Offset(m,T) ((int)(&((T *)1)->m) - 1)#else#define Offset(x, cls) ((dsize_t)((const char *)&(((cls *)0)->x)-(const char *)0))#endif#endifenum HeaderSizes{ /// Byte offset to payload of a PacketReceiveEvent PacketReceiveEventHeaderSize = Offset(data,PacketReceiveEvent), /// Byte offset to payload of a ConnectedReceiveEvent ConnectedReceiveEventHeaderSize = Offset(data,ConnectedReceiveEvent), /// Byte offset to payload of a ConsoleEvent ConsoleEventHeaderSize = Offset(data,ConsoleEvent)};
As you can see the Torque guys wrote their own Offset macro. Later on i had to declare those
enums as Global constant integer variable. Anyway, the engine gives seg fault in gentoo.. i have no idea why... i remember it ran well in my old mandrake-10 box.
But i really dint know that offsetof macros was already defined in stddef.h !! just wondering why did the Torque guys re-wrote it then !!??
Z
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement