Re: Getting sizeof an anonymous struct declared inside a union
David Resnick <lndresnick@gmail.com> writes:
> I'm faced with a header with anonymous structures declared inside a
> union like this:
>
> union msg {
> struct {
> int a;
> int b;
> } s1;
>
> struct {
> char c;
> double d;
> double e;
> } s2;
> };
>
> I want to apply the sizeof operator to one of these structs.
> Changing the header is not currently an option, alas.
>
> I currently can see two ways to do this as shown in this test program:
>
> #include <stdio.h>
> /* above union declaration here */
> int main(void)
> {
> union msg foo;
> printf("%lu\n", (unsigned long)sizeof(foo.s1));
> printf("%lu\n", (unsigned long)sizeof(((union msg*)(NULL))->s2));
>
> return 0;
> }
>
> Is the second legitimate?
I think so, yes. Unless the union contains a variable length array,
the operand of sizeof is not evaluated.
> It compiles without complaint, but looks
> dodgy.
> I hate to create a fake instance of the union just to apply the sizeof
> operator.
> Or is there another way?
You can use a compound literal (new in C99) which won't actually
'make' anything either:
sizeof (union msg){{0,0}}.s2;
but this requires you to know how to initialise a 'union msg' (so the
code changes if the structure changes) and you need C99. Since you
carefully cast sizeof's result to unsigned long (rather then using
%zu) I suspect you are not using C99.
--
Ben.
|