LCC: предварительная декларация Typedef'd Enum Failing?

Следующий фрагмент кода прекрасно компилируется в Mac OS X с gcc, но не компилируется в Windows с lcc-win32:

typedef enum Foo Foo;

// Other code here

enum Foo { Bar = 1 };

И дает эту ошибку:

неизвестное перечисление 'Foo'

В моем конкретном случае это не было проблемой. Я просто объединил утверждения в:

typedef enum Foo { Bar = 1 } Foo;

Но мне интересно, является ли LCC "более строгим" (придерживающимся некоторого стандарта) или "более тупым" (компилятор слишком туп, чтобы справиться с этой ситуацией).

Благодарю.

Также, пожалуйста, посмотрите мой другой вопрос LCC: LCC: Инициализация структур, содержащих структуры?

1 ответ

Решение

Предварительные объявления перечислений не являются стандартными (они нарушают раздел C.7 раздела 6.7.2.3) и gcc также предупредит вас, если вы добавите -pedantic флаг (который вы должны использовать при написании переносимого кода).

Причина этого заключается в том, что реализации могут свободно выбирать целочисленный тип, отличный от int использовать для представления перечисления (см. C99 раздел 6.7.2.2 §4). Однако, чтобы это работало, компилятор должен увидеть все значения, которые он должен представлять, прежде чем можно будет выбрать подходящий тип.

Другие вопросы по тегам