【发布时间】:2022-01-19 14:24:00
【问题描述】:
当volatile 值传递给它们时,一些 C 库函数会通过编译器忽略警告;例如memcpy()。
现在我想知道是否可以使用一些 volatile 强制转换来强制立即评估。
考虑:
int b; /* ... */
(volatile int) b = 1;
b = (volatile int) 1;
现在第二行会立即分配给b,第三行是否也一样?
或者不能将像1 这样的常量设置为“更不稳定”(意味着它不会有任何影响)?
【问题讨论】:
-
(volatile int) b = 1创建一个临时的右值。你不能分配给那个。也许*((volatile int*)&b) = 1;会有所作为。你最好检查一下组件。 -
立即作为什么,立即汇编指令或只是英语“立即”?
-
@TedLyngmo 是的,我不能分配给它,但表达式会产生一个被忽略的“易失性”值。但副作用应该是编译器不会移动指令,我猜。
-
@Lundin 想象一下,在该语句之前和之后还有许多其他指令(如
/* ... */所建议的那样)。立即应该意味着编译器不会移动语句,这意味着它在执行之前的指令之后进行评估,并且之后的指令在该语句之后执行 - 很好。 -
对于那些感兴趣的人,我在这里发布了一个关于该错误的问题:Non-conforming optimizations of volatile in gcc 11.1