当我使用g++ 4.7
编译以下代码时。
g++ -Wall -fstrict-aliasing
我会在第一次演员时收到警告:
warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
第二次演员没有任何警告就没事了。任何人都可以帮助我理解为什么第一次演员会发出警告?
int main()
{
char a [16];
char * p = &a[0];
//int i = *((int *)(&a[0])); //bad
int j = *((int *)(p)); //ok
return 0;
}
答案 0 :(得分:4)
第二次演员没有任何警告就没事了。任何人都可以帮助我理解为什么第一次演员会发出警告?
这不是你应该问的问题。你应该问的问题是为什么第二次演员没有显示警告,即使它与第一次演员一样有问题。
没有针对(int *) p
发出警告,因为p
可能,基于其类型,通过将指针指向int转换为{{1}而合法获得}}。但是,除非是这种情况,否则仍然不允许取消引用结果。即使你没有得到警告。
请注意,警告与可能“破坏”代码的优化无关。您的代码可能会收到警告并按预期工作。您的代码无法收到警告并失败。