伙计们,
考虑一下这段(可恶的)代码:
volatile unsigned long a[1];
unsigned long T;
void main(void)
{
a[0] = 0x6675636b; /* first access of a */
T = *a;
*(((char *)a) + 3) = 0x64; /* second access of a */
T = *a;
}
...问题:是((char *)a)
易失性还是非易失性?
这就引出了一个更大的问题:a 的两个访问之间是否存在依赖关系?也就是说,人类常识说有,但是 C99 标准说 volatile 的东西不会给 non-volatile 的东西加上别名——所以如果((char *)a)
是 non-volatile,那么这两个访问不会别名,并且没有依赖。
更准确地说,C99 6.7.3(第 5 段)如下:
“如果尝试通过使用具有非 volatile 限定类型的左值来引用具有 volatile 限定类型定义的对象,则行为未定义。”
那么当我们进行类型转换时a
,是否使用 volatile 限定符?