6

我正在尝试在 gcc 上编译以下内容-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

但仍然没有警告。这是一个错误吗?

4

1 回答 1

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;
}

尽管如此,g++ 4.6 仅在您使用-Wstrict-aliasing=2而不是-Wstrict-aliasing. 此外,它只显示演员 in 的警告 main(),而不是 in foo()。但是我看不出编译器如何/为什么会以不同的方式看待这两种类型。

于 2011-12-18T18:06:08.897 回答