2013-08-28 3 views
3

Im, развивающийся с помощью компилятора Microchips XC8 C 1.12.sizeof (struct foo) не постоянный?

У меня есть следующий фрагмент кода, но компилятор ему не нравится.

struct _foo { 
    int a; 
}; 

enum BAR { 
    CONST1 = sizeof(struct _foo) 
}; 

Ошибки я получаю: main.c:6: error: integer expression required Почему генерировать эту ошибку? Разве размер какой-либо структуры в C не является константой? Если я использую sizeof (int), все работает нормально.

Примечание: компилятор XC8 v1.12 следует стандарту C90, а не современному стандарту C99.

PS Это компилируется:

char abc[sizeof(struct _foo)]; 

И это выражение также должно быть постоянным во время компиляции ведет меня думать, что это на самом деле не то, что происходит не так в объявлении перечисления.

+6

Это похоже на ограничение в компиляторе. – ouah

+0

@ Gilles: Нет, массив переменной длины не может быть членом структуры. (Есть гибкие элементы массива, но они не вносят вклад в размер, о котором сообщает 'sizeof'.) –

+1

Использует ли' const int sizeof_foo = sizeof (struct _foo); enum BAR {CONST1 = sizeof_foo}; 'работа? Я бы не ожидал, что это будет иметь значение, но это того стоит. –

ответ

3

Это похоже на ограничение/ошибку компилятора Microchip XC8.

В перечислении постоянного определения, компилятор не учитывает sizeof (X), как постоянное выражения (даже если на самом деле это в C90 или C99), когда X либо совокупность или объединение типа, или объект агрегатного типа или объединений типа ,

+1

Да, это ограничение компилятора, но не тот, который вы описываете, так как работает 'sizeof (int)'. – Gilles

+0

@ Gilles является литой, фиксирующей ошибку компиляции? Компилятор может сделать некоторые ограничения «исключения» для размера стандартных скалярных типов. – ouah

+0

@ Gilles Я установил компилятор на свою машину, и действительно мое предыдущее объяснение было не очень хорошим. – ouah

Смежные вопросы