Re: Cast pointer to data member to integer type - legit?
Martin Bonner wrote:
kanze wrote:
Vidar Hasfjord wrote:
Scott Lehman wrote:
I'm actually looking for the [...] (the offset),
See the "offsetof" macro defined in <cstddef>:
size_t offsetof (structName, memberName);
Which only works for PODSs.
Note that its implementation is platform dependent.
By definition. That's why it's in the library -- there is
no way to implement it yourself.
On my compiler
(VC8) it is defined as:
#ifdef _WIN64
#define offsetof(s,m) (size_t)( (ptrdiff_t)&reinterpret_cast<const
volatile char&>((((s *)0)->m)) )
#else
#define offsetof(s,m) (size_t)&reinterpret_cast<const volatile
char&>((((s *)0)->m))
#endif
That's weird (especially the difference -- I don't see what the
cast to ptrdiff_t adds). The historically traditional
definition in C was the much simpler:
#define offsetof(s, m) (size_t)(&(((s *)0)->m))
and I don't see what the added complexity above buys.
The cast to const volatile char& is in case s is a class type
which defines operator &(). (The const volatile is in case s
is a const volatile type.)
I can buy that. Especially as, when looking at the standard, I
can see nothing which says that a class with a user defined
operator& is not a POD (which sort of surprised me -- I wonder
if it is intentional, or an oversight). Which in turn means
that the following code is legal:
#include <stddef.h>
struct Y { int x ; void operator&() {} } ;
struct X { int a ; Y b ; void operator&() {} } ;
int
main()
{
return offsetof( X, b ) ;
}
And the traditional C definition won't work in C++. (And that
Sun CC has a bug.)
--
James Kanze GABI Software
Conseils en informatique orient?e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S?mard, 78210 St.-Cyr-l'?cole, France, +33 (0)1 30 23 00 34
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]