c - sizeof anonymous nested struct -


suppose have structure i'm using model various packet formats:

#define maxpacket 20  typedef struct {     u8 packetlength;     union {         u8 bytes[maxpacket];         struct {             u16 field1;             u16 field2;             u16 field3;         } format1;         struct {             double value1;             double value2;         } format2;     }; } packet; 

i can expect sizeof(packet) 21. there way like:

sizeof(packet.format2) 

? i've tried that, compiler not happy. obviously, pull format1 out separate typedef , sizeof(format1). i'm curious if have through of that. hierarchical composition of formats. gcc on 8bit processor.

i'm equally interested if there's way use nested type. if have lot of

apacketpointer->format2.value1; // not onerous, if nesting gets deeper... 

then nice do:

packet.format2 *formatptr = &apacketpointer->format2; formatptr->value2; // etc 

again, refactoring bunch of preceding typedefs solve problem, lose nice namespacing effect of nested dotted references.

for work in c90, can use macro modeled on toolchain's offsetof() macro:

#define sizeof_field(s,m) (sizeof((((s*)0)->m))) 

adjust accordingly if toolchain's offsetof() macro isn't based on casting 0 pointer structure's type.

when use so:

std::cout << sizeof_field(packet,format1) << std::endl; std::cout << sizeof_field(packet,format2) << std::endl; 

i output:

6 16 

for second question, if you're willing rely on gcc's typeof extension can create similar macro declaring pointers nested anonymous structs:

#define typeof_field(s,m) typeof(((s*)0)->m)  ... typeof_field(packet,format2)* f2 = &foo.format2; 

to honest, find construct pretty ugly, might still better other options have available.

gcc documents "operand of typeof evaluated side effects if , if expression of variably modified type or name of such type", apparent null pointer deference should not result in undefined behavior when variable length array not involved.


Comments

Popular posts from this blog

sublimetext3 - what keyboard shortcut is to comment/uncomment for this script tag in sublime -

java - No use of nillable="0" in SOAP Webservice -

ubuntu - Laravel 5.2 quickstart guide gives Not Found Error -