Я получаю это предупреждение. Я хотел бы определить поведение, но я хотел бы сохранить этот код таким, какой он есть. Когда я могу нарушить правила псевдонимов?Когда я могу нарушать правила псевдонимов?
предупреждение: разыменования типа каламбурил указатель будет нарушать правила строгого сглаживания [-Wstrict-алиасы]
Строка моя собственная строка, которая является POD. Этот код вызывается из C. S может быть int. Строка в значительной степени struct String { RealString*s; }
, но шаблонные и вспомогательные функции. Я делаю статическое утверждение, чтобы убедиться, что String является модулем, составляет 4 байта, а int - 4 байта. Я также написал утверждение, которое проверяет, есть ли все указатели> = NotAPtr. Его в моей новой перегрузке/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
}
}
«Как быстро я могу ездить без получения ускоренного билета?» Microsoft сделала что-то подобное с помощью «MAKEINTRESOURCE», но они тоже пишут компилятор и могут добавить расширение. Обыкновенных смертных не может. И в C++ они могли бы добавить перегрузку. –
Здесь вы на скользком склоне. У вас действительно есть веская причина не создавать отдельные функции func_i и func_s? –
@PerJohansson: Я сделал это в начале проекта. Теперь эта причина больше не существует. Поэтому я сделал 2 функции. +1 –