仅包含标识符的表达式是否会读取volatile变量?

时间:2011-04-06 03:22:35

标签: c volatile standards

我正在使用Microchip的编译器编写微控制器(dsPIC24)。外围设备都是内存映射变量。偶尔有必要通过读取来清除缓冲区,我通常只使用它来执行:

SPI1BUF;

...其中SPI1BUF在Microchip的标题中声明为volatile char。它适用于我,但现在我很好奇:它是标准化的行为吗?我记得如果我执行任务:

unsigned char x = SPI1BUF;

......标准规定必须读取易失性变量。但对于标识符整体表达式情况是否也是如此?

1 个答案:

答案 0 :(得分:5)

这样的裸表达式是C标准中称为“表达式语句”的语句类型。标准的相关部分(6.8.3)说:

  

表达式中的表达式   声明被评估为无效   表达其副作用。

读取volatile - 限定变量的值被视为副作用,因此根据§5.1.2.3不能省略:

  

访问易失性对象,修改对象,修改文件或   调用执行任何这些操作的函数都是一面的   效果,它们是执行环境状态的变化。

假设SPI1BUF是左值(如果它是标识符,或扩展为一元*运算符的调用的宏,则为真),§6.3.2.1具有此权限说:

  

除非它是sizeof运算符的操作数,否则一元&   运算符,++运算符,--运算符或左运算符   .运算符或赋值运算符,没有的左值   将数组类型转换为存储在指定的值   对象(并且不再是左值)。

由于没有例外适用,这可以确保我们底层(易变)对象是“已访问”,因为左值已经转换为存储在对象中的值,这显然需要访问该对象的价值。

总结:是的,这是标准行为。