#define HTON_I32(x) htonl(x)
inline float __HTON_F32(float x)
{
int i = HTON_I32(*((int *)(&x)));
return (*((float *)(&i)));
}如何解析上述代码中的警告dereferencing type-punned pointer will break strict-aliasing rules
发布于 2011-11-23 00:46:16
消除打字的双关语,用面对别名时不脆弱的东西取而代之:
#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)。您可能想要添加一个断言来实现此效果。
发布于 2011-11-23 01:34:19
您可以使用联合进行类型双关,这会处理可能的对齐和别名问题(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;
}https://stackoverflow.com/questions/8230356
复制相似问题