At Joseph Koshy's request, this is now filed as misc/72307. -Patrick On Sun, 2004-10-03 at 20:02 -0500, Patrick Hartling wrote: > 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/
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:15 UTC