Using Compound Literal + type-punning to initialize static const array

Joseph Myers joseph@codesourcery.com
Fri Nov 28 16:19:00 GMT 2014


On Fri, 28 Nov 2014, Mason wrote:

> On 24/11/2014 17:53, Mason wrote:
> 
> > Consider the following code: [big snip]
> 
> (Perhaps my previous message was too verbose.)
> 
> Why does gcc reject the following code:
> 
> union foob { int val; struct { int X; } bits; };
> static const int u = ((union foob) {.bits = { .X=42 }}).val;
> 
> $ gcc -std=gnu89 test.c
> test.c:2:30: error: initializer element is not constant
>   static const int u = ((union foob) {.bits = { .X=42 }}).val;

For the reason stated in the error message: that initializer is not a 
constant expression (it involves access to an anonymous object).  There is 
a limited allowance in GNU C for when the initializer is a compound 
literal of the right type (so that you can define a macro of a structure 
or union type that expands to something usable in both assignments and 
initializers), but not for any more complicated operations involving them.

-- 
Joseph S. Myers
joseph@codesourcery.com



More information about the Gcc-help mailing list