Будет ли выражение, содержащее только идентификатор, читать переменную? - PullRequest
0 голосов
/ 06 апреля 2011

Я пишу для микроконтроллера (dsPIC24) с использованием компилятора Microchip. Все периферийные устройства являются отображаемыми в памяти переменными. Иногда необходимо очистить буфер, читая из него, что я обычно делаю просто:

SPI1BUF;

... где SPI1BUF объявлено volatile char в заголовках Microchip. Это работает для меня, но теперь мне любопытно: это стандартизированное поведение? Напоминаю, что если я выполню задание:

unsigned char x = SPI1BUF;

... стандарт гласит, что переменная должна быть прочитана . Но верно ли это для случая «идентификатор как целое»?

1 Ответ

5 голосов
/ 06 апреля 2011

Такое простое выражение - это тип оператора, называемый «оператор выражения» в стандарте C. В соответствующем разделе стандарта (6.8.3) говорится:

Выражение в выражении заявление считается недействительным выражение для его побочных эффектов.

Чтение значения volatile -качественной переменной считается таким побочным эффектом, поэтому его нельзя исключить, согласно §5.1.2.3:

Доступ к изменчивому объекту, изменение объекта, изменение файла или вызывая функцию, которая выполняет любую из этих операций, все стороны эффекты, которые являются изменениями в состоянии среды выполнения.

Предполагая, что SPI1BUF является lvalue (это верно как для идентификатора, так и для макроса, который расширяется до вызова унарного оператора *), в §6.3.2.1 есть следующее:

За исключением случаев, когда это операнд оператора sizeof, унарный & оператор, оператор ++, оператор -- или левый операнд оператор . или оператор присваивания, значение которого не иметь тип массива преобразуется в значение, хранящееся в назначенном объект (и больше не является lvalue).

Поскольку ни одно из исключений не применимо, это гарантирует нам, что базовый (изменчивый) объект является «Доступным», поскольку lvalue было преобразовано в значение, хранящееся в объекте, что, очевидно, требует доступа к стоимость этого объекта.

В итоге: да, это стандартное поведение.

...