当我用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;
}发布于 2013-02-08 01:22:37
第二次强制转换在没有任何警告的情况下没有问题。有没有人能帮我理解为什么在第一次施法时会出现警告?
这不是你应该问的问题。你应该问的问题是,为什么第二个角色没有显示警告,尽管它和第一个角色一样有问题。
不会对(int *) p发出警告,因为根据其类型,可以通过将指向整型的指针转换为char *来合法获取p。但是,除非是这种情况,否则仍然不允许取消对结果的引用。即使你没有得到任何警告。
请注意,该警告与可能“破坏”您的代码的优化无关。您的代码可能会收到警告,并按预期工作。您的代码无法获得警告,因此失败。
https://stackoverflow.com/questions/14756234
复制相似问题