我正在尝试使用-pedantic-errors -pedantic -Wall -O2
#include <iostream>
void reset_uint32(uint32_t* pi)
{
char* c = (char*)(pi);
uint16_t* j = (uint16_t*)(c); // warning?
j[0] = 0;
j[1] = 0;
}
void foo()
{
uint32_t i = 1234;
reset_uint32(&i);
}
int main() {
foo();
}
但我没有看到任何严格的别名警告。我也尝试启用
-fstrict-aliasing
-Wstrict-aliasing
但仍然没有警告。这是一个错误吗?
答案 0 :(得分:1)
我重写了你的例子以产生关于违反严格别名规则的警告:
void foo(int* pi) {
short* j = (short*)pi;
j[0] = j[1] = 0;
}
int main() {
int i = 1234;
foo(&i);
short* j = (short*)&i;
j[0] = j[1] = 0;
}
即使如果使用-Wstrict-aliasing=2
而不是-Wstrict-aliasing
编译代码,g ++ 4.6也会显示警告。此外,它仅在main()
中显示投射警告,而不是foo()
。但是我看不出编译器如何/为什么会以不同的方式看待这两个演员。