On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 28.07.12 19:15. Заголовок: Различная реакция компиляторов на объявление typedef с пустым списком имен


На днях совершенно случайно обнаружил, что компиляторы по-разному реагируют на некорректную синтаксическую конструкцию, связанную со спецификатором объявления typedef.
Согласно стандарту ( 7. Declarations, #3):


 цитата:
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 ]



То есть 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 
ПрофильЦитата Ответить
Новых ответов нет


Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 16
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет