Douglas Gregor wrote:
On Tuesday 04 March 2003 10:16 pm, Edward Diener wrote:
Beman Dawes wrote:
Have you considered proposing a macro which will automatically apply the appropriate #pragma for the compiler? That way the knowledge of what #pragma to apply for each compiler only has to be maintained and tested in one place.
Excellent idea. Now why didn't I think of that <g>. It's the old forest and the trees thing, no doubt.
The macro would have to be in the form of:
BOOST_DATA_LAYOUT_BEGIN
at the beginning of a header file surrounding any class/struct/union/enum declarations and
BOOST_DATA_LAYOUT_END
at the end.
Would you willing to provide the definitions for these macros (or, as I suspect, begin/end headers)? I'd be happy to use them, but as I've never needed such a thing I don't know the particular pragmas to use.
I can give anyone the #pragmas for VC++ and BCB and their meanings for data layout. You, or any other Boost developer, should be able to take it from there. John Maddock also knows them well since there are in the Regex++ header files. For other compilers, if they exist, others would have to supply them. ---------------------------------------------------------------------------- ---------------------------------------------------- For BCB the begin and end #pragmas would be of the form: #pragma option push -option [ -option ... ] #pragma option pop where option for data layout would be: -an = packing, where n = 1,2,4,8,16 with the default being 8 -b(-) = enum size, where -b = integer size ( default ) and -b- = byte-sized when possible -Ve(-) = zero-length empty base classes where -Ve = turns it on and -Ve- = turns it off ( default ) -Vx(-) = zero-length class data members where -Vx = turns it on and -Vx- = turns it off ( default ) A setting for a header which sets the defaults would be #pragma option push -a8 -b -Ve- -Vx- // Class/struct/union/enums #pragma option pop ---------------------------------------------------------------------------- ---------------------------------------------------- For VC++ the begin and end #pragmas just encompass the packing alignment since VC++ doesn't allow any other data layout alternatives as BCB does above. The form is #pragma pack(push,n) #pragma pack(pop) where n is your 1,2,4,8,16 packing with 8 being the default. A setting for a header which sets the default would be #pragma pack(push,8) // Class/struct/unions #pragma pack(pop) ---------------------------------------------------------------------------- ----------------------------------------------------- Two important things to realize when using these in header files 1) Don't have any intervening #includes in between the pushing and popping of options 2) You can do multiple and nested push and pops so there is much flexibility with this system, but of course KISS still applies very well here.