Может ли кто-нибудь объяснить это поведение?«элемент инициализации не является постоянным» с использованием назначенного инициализатора на статической структуре с C99
Используя флаг компилятора std=c99
я получаю следующие ошибки:
- «инициализатор элемент не является постоянная» для b1.
- Ожидаемое выражение перед '.' токен "для b2
- b3 в порядке.
Когда не используется -std=c99
, все линии в порядке. Если статический b1 не используется, это нормально. Я использую GCC.
typedef struct A_tag {
int v;
int w;
} A;
typedef struct B_tag {
A super;
int x;
int y;
} B;
void test(){
static B b1 = ((B){.super={.v=100}, .x=10});
static B b2 = ({.super={.v=100}, .x=10});
static B b3 = {.super={.v=100}, .x=10};
}
Почему '(B)' перед инициализацией? – haccks
@JoachimPileborg Ваше утверждение неверно, оно связано с C99. Ошибка возникает также с '-std = gnu99', но исчезает с' -std = c89' или '-std = gnu89'. Неожиданно clang принимает код с флагом C99 и без него. – usr1234567
Я просто добавил еще одну ошибку при установке инициализатора в скобки. Мне нужны эти скобки, потому что я хочу использовать инициализатор в макросе. обходной путь: #define PROTECT (...) __VA_ARGS__ – Dill