Форум » C/C++ » Различная реакция компиляторов на объявление typedef с пустым списком имен » Ответить

Различная реакция компиляторов на объявление typedef с пустым списком имен

Сыроежка: На днях совершенно случайно обнаружил, что компиляторы по-разному реагируют на некорректную синтаксическую конструкцию, связанную со спецификатором объявления typedef. Согласно стандарту ( 7. Declarations, #3): [quote]In such cases, and except for the declaration of an unnamed bit-field (9.6), the decl-specifier-seq shall introduce one or more names into the program, or shall redeclare a name introduced by a previous declaration. [ Example: enum { }; // ill-formed typedef class { }; // ill-formed —end example ][/quote] То есть typedef объявление должно вводить в программу одно или более имен или переобъявлять уже существующие имена. Как видно из последнего примера из цитируемого текста стандарта конструкция typedef class {}; является некорректной, так как она не вводит имя. Аналогичным образом конструкция вида typedef int; также является некорректной. К разочарованию программистов компиляторы по-разному реагируют на присутствие подобной некорректной конструкции в коде программы. Так, например, MS VC++ 2010 просто выдает предупреждение и спокойно далее компилирует программу и запускает ее на выполнение.. Причем текст предупреждения меняется в зависимости от того, какой тип присутствовал в typedef объявлении. Так для конструкции typedef int; выдается предупреждение warning C4091: typedef : пропускается слева от "int", когда ни одна переменная не объявлена А для конструкции вида typedef class {}; выдается предупреждение warning C4094: пустое объявление "class" пропускается Те же самые примеры typedef объявлений, запущенные с помощью онлайнового компилятора, выдают сообщение об ошибке. error: missing type-name in typedef-declaration Почему к разочарованию программистов? Потому что генерация предупреждения вместо сообщения об ошибке может привести к непрятным последствиям. Если ваш компилятор, допустим, выдает много предупреждений, смысл которых вам понятен и вы сознательно допускаете такие предупреждения, как, например, предупрежедение MS VC++ 2010, что он игнорирует спецификацию исключения для функции, то среди таких предупрежедений вы можете не заметить то предупреждение, которое на самом деле для вашей программы является ошибкой. Лучше бы конечно было, если бы все компиляторы рассматривали такие некорректные typedef конструкции как ошибочные. Так как очевидно, что если такая конструкция присутствует в вашем коде, то она присутствует там по вашему недосмотру или в виду опечатки, так как вы явно имели в виду нечто другое.

Ответов - 0



полная версия страницы