#define HTON_I32(x) htonl(x)
inline float __HTON_F32(float x)
{
int i = HTON_I32(*((int *)(&x)));
return (*((float *)(&i)));
}
如何解決上面的代碼如何解決警告:提領類型-punned指針將打破嚴格走樣規則
#define HTON_I32(x) htonl(x)
inline float __HTON_F32(float x)
{
int i = HTON_I32(*((int *)(&x)));
return (*((float *)(&i)));
}
如何解決上面的代碼如何解決警告:提領類型-punned指針將打破嚴格走樣規則
消除類型雙關警告dereferencing type-punned pointer will break strict-aliasing rules
,並與一些與工作不」更換T IN混疊面對脆弱:
#include <string.h>
inline float __HTON_F32(float x) {
int i;
memcpy(&i, &x, sizeof x);
i = HTON_I32(i);
memcpy(&x, &i, sizeof x);
return x;
}
合理的優化編譯器會降低memcpy
調用,生成當量(有時更好)代碼,您從類型雙關會得到什麼。
您將看到的另一個常見解決方案涉及工會。所有這些解決方案都假設爲sizeof(int) == sizeof(float)
。你可能想要添加一個assert來達到這個效果。
您可以使用類型雙關,這需要照顧的可能對齊和走樣的問題工會(C99:TC3明確提到,這確實是合法的):
#include <stdint.h>
inline float __HTON_F32(float x) {
union { float as_float; int32_t as_int; } value = { x };
value.as_int = HTON_I32(value.as_int);
return value.as_float;
}
你可以用編譯-fno嚴格 - 啓用標誌。這將刪除有關嚴格別名問題的警告 –
@TonyTheLion:它不能解決問題,它隱藏了它,並隱藏了代碼中的其他潛在問題。不是一個好主意。 – Mat
@Mat,不,這會以優化成本解決問題。 –