[an error occurred while processing this directive]
Ответ: Стандарты С и С++ есть!
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
миниатюрный аудио-видеорекордер mAVR

Отправлено Oldring 26 июня 2002 г. 22:43
В ответ на: Ответ: Любое неявное или арифметическое преобразование типов является непереносимым. Далее, до сих пор не существует стандарта C для микроконтроллеров, по-моему, нет стандарта и для C++, для С есть несколько стандартов, какому именно будет соответствовать компилятор, будем решать не мы, а разработчики компилятора. отправлено trainer 25 июня 2002 г. 21:47

"С для микроконтроллеров" действительно нет - просто потому, что стандарт языка описывает абстрактную модель вычислений, не привязываясь к конкретной архитектуре, на которой эти вычисления будут исполняться. Нет разницы, на микроконтроллере или на суперкомпьютере. А стандарты есть, и, более того, они международные. См. например, ISO/IEC 9899:1990 в качестве примера. Другое дело, что стандарт эволюционирует вместе с языком, поэтому периодически выходят обновленные версии стандарта. Но говорить, что есть несколько стандартов - нельзя. Есть Стандарт - это последняя версия, и есть предыдущие версии стандарта. На последнюю версию и ориентируются разработчики компиляторов, а если не могут вовремя поддержать его новые свойства - тогда продают компилятор, работающий с предпоследней или даже более ранней версией стандарта.

Только к обсуждаемому вопросу это не имеет никакого отношения: целочисленное расширение char до int при вычислении выражений было в C всегда еще со времен K&R и зафиксировано во всех редакциях стандарта. Так что мое утверждение остается в силе - если компилятор для ((unsigned char)16)<<8 дает ноль, это противоречит стандарту С, а значит есть два варианта:

1. Если такое поведение непредусмотрено - значит, это ошибка компилятора.
2. Если такое поведение предусмотрено, так как включена соответствующая опция в проекте - тогда компилятор делает правильно, но язык, который он компилирует - это не С. Я не говорю, что это плохо - но это именно нестандартное расширение.

Стандарт языка очень четко описывает при соблюдении каких требований программа будет выполняться на всех машинах одинаково, и какие вещи могут быть реализованы разными компиляторами по-разному. Так вот, ни один совместимый со стандартом компилятор не имеет права не расширять char до int при вычислении выражений.

А по поводу непереносимости "любого неявного или арифметического преобразования типов" - так Вы тут просто говорите неправду. Прежде всего возникает вопрос, а при чем здесь "или"? И второй вопрос: дана функция на С

unsigned int f( unsigned char w )
{
return w;
}

Не могли бы Вы привести в качестве примера какое-нибудь значение w и два различных числа, допустимых в качестве результата функции f(w) для различных реализаций языка C, каждая совместимая хоть с одной версией стандарта языка? Что, не можете?

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru