Я получаю это предупреждение. Я хотел бы определенное поведение, но я хотел бы сохранить этот код как есть. Когда я могу нарушать правила псевдонимов?
предупреждение: разыменование указателя с символом типа нарушит правила строгого псевдонима [-Wstrict-aliasing]
Строка - это моя собственная строка, которая является POD. Этот код вызывается из C. S может быть int. Строка в значительной степени struct String { RealString*s; }
, но содержит шаблоны и вспомогательные функции. Я делаю статическое утверждение, чтобы убедиться, что String является pod, имеет 4 байта, а int — 4 байта. Я также написал утверждение, которое проверяет, все ли указатели >= NotAPtr. Это в моей перегрузке new/malloc. Я также могу поместить это утверждение в String, если вы предложите
Учитывая правила, которым я следую (в основном эта строка представляет собой модуль и всегда имеет тот же размер, что и 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++ они могли бы добавить перегрузку. - person Bo Persson   schedule 19.03.2012