offsetof() macro, C++, and GCC 3.4.2
Patrick Hartling
patrick at 137.org
Sun Oct 3 18:03:34 PDT 2004
The offsetof() macro defined in stddef.h evaluates to code that can
violate the C++ standard depending upon the context of its use. I have
attached code that demonstrates the problem. GCC 3.4.2 in the base
system refuses to compile the code, giving this error message:
% g++ -c const-exp.cpp
const-exp.cpp:14: error: a casts to a type other than an integral or
enumeration type cannot appear in a constant-expression
const-exp.cpp:14: error: '->' cannot appear in a constant-expression
const-exp.cpp:14: error: `&' cannot appear in a constant-expression
The gcc34 port (gcc-3.4.2_20040827) builds it just fine. The
difference, as far as I can tell, is that gcc34 from the Ports
Collection gets offsetof() from its own stddef.h, which has C++-friendly
code:
/* Offset of member MEMBER in a struct of type TYPE. */
#ifndef __cplusplus
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#else
/* The cast to "char &" below avoids problems with user-defined
"operator &", which can appear in a POD type. */
#define offsetof(TYPE, MEMBER) \
(__offsetof__ (reinterpret_cast <size_t> \
(&reinterpret_cast <const volatile char &> \
(static_cast<TYPE *> (0)->MEMBER))))
#endif /* C++ */
Would fixing this problem be as simple as using the above code
in /usr/include/stddef.h?
The attached code was adapted from some very similar code in
Boost.Python (from the file boost/python/object/instance.hpp), which
does not compile with the base system GCC 3.4.2. There may be other
parts of Boost 1.31.0--and the upcoming Boost 1.32.0--that are affected
by this offsetof() problem.
-Patrick
--
Patrick L. Hartling | Research Assistant, VRAC
http://www.137.org/patrick/ | 2274 Howe Hall Room 2624
PGP: http://tinyurl.com/2oum9 | http://www.vrac.iastate.edu/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: This is a digitally signed message part
Url : http://lists.freebsd.org/pipermail/freebsd-current/attachments/20041003/1118f9d7/attachment.bin
More information about the freebsd-current
mailing list