考虑以下内容:
int *volatile x;
(void)x;
GCC(从 5.x 到 7.x)在启用 -Wall
时提示它:
warning: 'x' is used uninitialized in this function [-Wuninitialized]
clang 对此保持沉默。
出于某种原因,删除 volatile
会消除警告。
标准是否表示将 volatile
指针转换为 void
是未定义的,而转换普通指针就可以了?或者这是一个 GCC 错误?
免责声明:问题被故意标记为 C/C++。 GCC 对这两种语言给出了相同的警告,我很想知道它们之间有什么区别。
最佳答案
对于像 int *
这样的普通旧数据类型,volatile
的行为之一是防止编译器优化读取和写入变量。请注意,这里的 int *
可以是 float
或 int
之类的任何东西。
因此 (void)x
的意思是“读取 x 并且不对结果执行任何操作”,因为 x
是 volatile
。如果您读取 x
并且它没有固定到内存中的固定位置(编译器可能不知道,只有链接器知道),那么您实际上是在使用它未初始化 .
如果它不是易变的,尽管编译器可能会读取 x
,它可能会避免/优化它(因为它是一个空操作),并使警告静音。
clang 在这里选择了安全的道路,并且由于链接器指令可以将变量 x 固定到某个位置(clang 不知道它),认为在没有更多证据的情况下触发警告是不值得的。
关于c++ - 为什么 GCC 在将未初始化的 volatile 指针转换到 `void` 时发出警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42233379/