Я столкнулся с странным поведением при использовании сложных литералов для статической инициализации структуры в GCC
в режимах c99/gnu99
.
По-видимому, это нормально:
struct Test
{
int a;
};
static struct Test tt = {1}; /* 1 */
Однако это не так:
static struct Test tt = (struct Test) {1}; /* 2 */
Это вызывает следующую ошибку:
Элемент инициализации не является константой
Также это не помогает:
static struct Test tt = (const struct Test) {1}; /* 3 */
Я понимаю, что значение инициализации для статической структуры должно быть константой времени компиляции. Но я не понимаю, почему это самое простое выражение инициализатора больше не считается постоянным? Является ли это стандартом?
Причина, по которой я спрашиваю, заключается в том, что я столкнулся с некоторым унаследованным кодом, написанным в GCC в режиме gnu90, который использовал такую составную литералную конструкцию для статической инициализации структуры (2). По-видимому, это было расширение GNU в то время, которое позднее было принято C99.
И теперь это приводит к тому, что код, который успешно скомпилирован с помощью GNU90
, не может быть скомпилирован ни с C99
, ни даже с GNU99
.
Зачем мне это делать?