#include <stdint.h>
#define INIT_UINT32 1
#define INIT_INT32 2
#define INIT INIT_INT32
typedef union
{
uint32_t a;
int32_t b;
} Foo_t;
/* Why does this compile... */
static Foo_t foo_static = INIT == INIT_INT32 ?
(Foo_t){ .a = UINT32_MAX} : (Foo_t){ .b = INT32_MAX };
/* but this doesn't? */
static Foo_t foo_static_array[] =
{
INIT == INIT_INT32 ? (Foo_t){ .a = UINT32_MAX} : (Foo_t){ .b = INT32_MAX }
};
int main(void)
{
}
When compiled, the conditional initialization of foo_static using compound literals succeeds, but the conditional initialization of foo_static_array using compound literals fails. Following are the compile errors.
$ gcc test.c
test.c:4:21: error: initializer element is not constant
4 | #define INIT_INT32 2
| ^
test.c:6:14: note: in expansion of macro ‘INIT_INT32’
6 | #define INIT INIT_INT32
| ^~~~~~~~~~
test.c:21:3: note: in expansion of macro ‘INIT’
21 | INIT == INIT_INT32 ? (Foo_t){ .a = UINT32_MAX} : (Foo_t){ .b = INT32_MAX }
| ^~~~
test.c:4:21: note: (near initialization for ‘foo_static_array[0]’)
4 | #define INIT_INT32 2
| ^
test.c:6:14: note: in expansion of macro ‘INIT_INT32’
6 | #define INIT INIT_INT32
| ^~~~~~~~~~
test.c:21:3: note: in expansion of macro ‘INIT’
21 | INIT == INIT_INT32 ? (Foo_t){ .a = UINT32_MAX} : (Foo_t){ .b = INT32_MAX }
| ^~~~
Can anyone explain why this is the case?