Перейти к содержанию
    

Непонятки с volatile

Доброго времени суток!

 

Ситуация следующая:

a[b++]=c;

a,b,c имеют тип uchar volatile

компайлер ругается:

Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement

 

Что у меня не так? GCC глотал на "ура"...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что у меня не так?

Черным по белому:

the order of volatile accesses is undefined in this statement

Что не понятно? Что при безумном (подумайте зачем Вы их напихали!) количестве volatile разобраться компилятору в том, что Вы от него хотите сложно? Ну "GCC глотал" совершенно ни о чем не говорит без перечня ключей при которых его заставили замолчать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

a[b++]=c;

a,b,c имеют тип uchar volatile

Когда столько volatile переменных в одном выражении, то порядок их вычисления неопределён, о чём и предупреждение.

Для полной определённости разбейте выражение на несколько, либо избавьтесь от неоправданных volatile.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Компилятор все равно разобьет ваше выражение (за один такт он его несомнено не вычислит), а volatile говорит компилятору, что значение переменной может быть изменено где то в другом месте (например в прерывании), и он не понимает, в каком порядке проверять текущие значения переменных при вычислении.

Даже если бы компилятор не заругался, эта ситуация нестабильная. Если в процессе вычисления выражения произойдет прерывания и изменится одна из ваших переменных результат вычисления может быть не верным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...