Я был очень удивлен, когда увидел, что следующий код компилируется без ошибок или предупреждений в g++ - 4.2:
typedef enum test { one };
Мое предположение заключалось в том, что если бы вы использовали ключевое слово typedef
, для этого потребовался бы дополнительный идентификатор, например:
typedef enum test { one } test;
Как уже упоминалось, g++ - 4.2 принимает его даже без предупреждения. Clang++ 3.0 предупреждает "предупреждение: typedef требует имя", аналогично, Комо предупреждает "предупреждение: декларация требует имени typedef", а g++ - 4.6 сообщает: "предупреждение:" typedef "в этом объявлении игнорировалось".
Я не смог определить, где в стандарте это разрешено, и я нахожу его немного запутанным, что два из компиляторов предупреждают, что это необходимо, не должно быть ошибкой, если требуется имя typedef, но нет?
UPDATE. Я проверил на C с теми же компиляторами. Clang и goau дают тот же результат, gcc дает предупреждение: "предупреждение: бесполезный спецификатор класса хранения в пустой декларации", что кажется еще более запутанным.
UPDATE: я проверил удаление имени перечисления, и результаты будут одинаковыми:
typedef enum { one };
Аналогично названной структуре:
typedef struct named { int x };
Но не с неназванной структурой, и в этом случае код был отклонен в g++ (4.2/4.6) с "error: missing type-name в typedef-declaration", gcc (4.2/4.6) дал предупреждение: "предупреждение: unnamed struct/union, который не определяет экземпляры", clang++ "warning: декларация ничего не объявляет", ошибка при запуске ": объявление требует имени typedef"