我的问题很简单。当你想告诉编译器变量可以在它使用的范围之外改变时,关键字 volatile 是强制性的,例如嵌入式系统中的内存映射变量或可以响应接收信号而改变的信号处理程序变量。操作系统。[删除了关于线程通信的部分,因为它只会产生混乱,这不是我的问题]。[使用下面的评论重新表述问题以澄清]
我认为 OP 所问的是 volatile 是否会增加变量的全局性质尚未施加的进一步限制(事实上,它是全局的,对编译器施加了某些限制,类似于 volatile 强制要求的限制)。
C 中的全局是否隐式易变?
不。
您对extern变量和volatile变量感到困惑,因为它们都不能被编译器完全优化,因为它们都可以在外部进行修改。但这并不意味着它们具有相同的语义。
考虑可用于全局变量的链接时间优化。这意味着,编译器完全有可能获得关于全局变量的完整信息,从而像任何其他变量一样对其进行相应的优化。但是volatile意味着编译器不能对此有任何假设。因为它可以在运行时从外部修改。
因此:
volatile int vol_global_var;
Run Code Online (Sandbox Code Playgroud)
和
int nonvol_global_var;
Run Code Online (Sandbox Code Playgroud)
不能一视同仁。因为,有了足够的信息,编译器就可以完全优化掉nonvol_global_var. 但它永远不能为vol_global_var.
所以,什么时候让一个全局变量被volatile限定与决定什么时候让任何变量被volatile限定并没有什么不同。