4

当我用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;
}
4

1 回答 1

4

第二个演员很好,没有任何警告。谁能帮我理解为什么在第一次演员表上发出警告?

这不是你应该问的问题。你应该问的问题是为什么第二个演员没有显示警告,即使它和第一个演员一样有问题。

不会为 发出警告(int *) p,因为根据其类型,可以通过将指向 int 的指针强制转换为 来合法地p 获得char *。但是,除非是这种情况,否则仍不允许取消引用结果。即使你没有收到警告。

请注意,警告与可能“破坏”您的代码的优化无关。您的代码可能会收到警告并按预期工作。您的代码无法收到警告并失败。

于 2013-02-07T17:22:36.873 回答