Re: Inheritance and offsetof
On 21 Set, 20:51, "Francesco S. Carta" <entul...@gmail.com> wrote:
On 21 Set, 20:20, Marcel M=FCller <news.5.ma...@spamgourmet.org> wrote:
When I switch an existing project to gcc I get dozens of warnings
concerning offsetof. The code runs fine with and without gcc. Of course
this means nothing.
Example:
#include <stddef.h>
#define structoffsetof(type, base) ((int)(static_cast<base*>((type*)64)=
)-64)
struct A
{ int m1;
int m2;
};
struct B : A
{ int m3;
};
int main()
{ A a;
a.m1 = offsetof(B, m3) - structoffsetof(B, A);
return 0;
}
test.cpp: In function `int main()':
test.cpp:16: warning: invalid access to non-static data member `A::m1'
of NULL object
test.cpp:16: warning: (perhaps the `offsetof' macro was used incorrectl=
y)
Of course, it is because B is no longer a C style POD type because of
the inheritance. But even if the memory layout is up to the
implementation the offset of m3 should be stable.
I use this in a wrapper to a C library which takes struct A* as type an=
d
requires relative offsets to custom components. I would prefer not to
use aggregation because A has many members and this would significantly
blow up the code.
Is it undefined behavior or is it only a warning?
I have no answer to your questions but I have a question on my turn:
isn't there any better way to achieve the same result other than using
those macros?
I mean, if you want the offset of B over its base A, isn't enough to
call sizeof(A)?
Also, to get the offset of a member over the base address of an
object, isn't enough to compute the difference between those two
addresses?
I feel a bit confused.
Also, I think that either there is a problem in your structoffsetof
macro or in my understanding of your purposes (likely so) because it
equates to zero while I would have expected it to equate to "sizeof
(A)".
About the other macro, "offsetof(B, m3) == (size_t(&b.m3) - size_t
(&b))" on my system, hence I cannot see the need for that macro, which
does castings all over the place.
Where exactly did I lose myself?
Francesco
--
Francesco S. Carta, hobbyist
http://fscode.altervista.org