4

次のコードをでコンパイルするとg++ 4.7

g++ -Wall -fstrict-aliasing 

最初のキャストで警告が表示されます。

warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]

2番目のキャストは警告なしで問題ありません。誰かが最初のキャストで警告する理由を理解するのを手伝ってもらえますか?

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

2 番目のキャストは警告なしで問題ありません。最初のキャストで警告する理由を理解するのに役立つ人はいますか?

それはあなたが尋ねるべき質問ではありません。最初のキャストとまったく同じ問題があるのに、2 番目のキャストで警告が表示されない理由を尋ねるべきです。

could は、その型に基づいて、 int へのポインタを にキャストすることによって正当に取得されている(int *) pため、に対して警告は発行されません。ただし、そうでない限り、結果の逆参照は許可されません。警告を受けなくても。p char *

警告は、コードを「壊す」可能性のある最適化とは無関係であることに注意してください。コードは警告を受け、意図したとおりに動作する可能性があります。あなたのコードは警告を受け取ることができず、失敗しました。

于 2013-02-07T17:22:36.873 に答える