我正在用微芯片的编译器为一个微控制器(dsPIC24)写作。外围设备都是内存映射变量.偶尔有必要通过读取缓冲区来清除缓冲区,我通常会这样做:
SPI1BUF;...where SPI1BUF在微芯片的头中被声明为volatile char。这对我有用,但现在我很好奇:这是标准化行为吗?我记得,如果我执行一项任务:
unsigned char x = SPI1BUF;...the标准规定,必须读取易失性变量。但是,对于标识符作为整个表达式的情况也是这样吗?
发布于 2011-04-06 04:21:25
这种裸表达式是C标准中称为“表达式语句”的语句类型。标准的有关部分(6.8.3)规定:
表达式语句中的表达式由于其副作用被计算为一个空表达式。
读取volatile-qualified变量的值被认为是这样的副作用,因此不能根据第5.1.2.3节对其进行删除:
访问易失性对象、修改对象、修改文件或调用执行任何这些操作的函数的
都是副作用,它们都是执行环境状态的变化。
假设SPI1BUF是一个lvalue (如果它是一个标识符,或者是一个扩展到对一元*操作符的调用的宏),那么第6.3.2.1节有这样的意思:
除非是
sizeof运算符、一元&运算符、++运算符、--运算符或.运算符或赋值运算符的操作数,否则不具有数组类型的lvalue将转换为存储在指定对象中的值(而不再是lvalue)。
由于不存在任何异常,这可以确保基础(易失性)对象被“访问”,因为lvalue已转换为存储在对象中的值,这显然需要访问该对象的值。
总之:是的,这是标准行为。
https://stackoverflow.com/questions/5561098
复制相似问题