Afficher un message
Vieux 17/10/2007, 16h44   #3
Ben Bacarisse
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut 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.
  Réponse avec citation
 
Page generated in 0,04931 seconds with 9 queries