我收到了这个警告。我希望它有明确定义的行为,但我想保留这个代码。什么时候我可以破坏别名规则?
考虑到我遵循的规则(主要是字符串是一个pod,并且始终与int大小相同),如果我打破别名规则,会怎样?这是少数情况之一吗?
String是我的自定义字符串,它是一个POD(平凡标量类型)。这段代码由C调用。S可能是一个int。String基本上是警告:取消引用类型混合指针将会破坏严格别名规则 [-Wstrict-aliasing]
struct String { RealString* s; }
,但使用了模板和辅助函数。我做了一个静态断言来确保String是一个pod,大小为4字节,int也是4字节。我还编写了一个断言,检查所有指针是否≥ NotAPtr。它在我的new/malloc重载中。如果你建议的话,我也可以把那个断言放在String里。考虑到我遵循的规则(主要是字符串是一个pod,并且始终与int大小相同),如果我打破别名规则,会怎样?这是少数情况之一吗?
void func(String s) {
auto v=*(unsigned int*)&s;
myassert(v);
if(v < NotAPtr) {
//v is an int
}
else{
//v is a ptr
}
}
MAKEINTRESOURCE
中做了类似的事情,但他们也编写了编译器并添加扩展。普通人无法做到这一点。而且在 C++ 中,他们可以添加一个重载函数。" - Bo Persson