首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决警告:取消引用类型双端指针将违反严格的别名规则

如何解决警告:取消引用类型双端指针将违反严格的别名规则
EN

Stack Overflow用户
提问于 2011-11-23 00:40:38
回答 2查看 2.6K关注 0票数 5
代码语言:javascript
复制
    #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

EN

回答 2

Stack Overflow用户

发布于 2011-11-23 00:46:16

消除打字的双关语,用面对别名时不脆弱的东西取而代之:

代码语言:javascript
复制
#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)。您可能想要添加一个断言来实现此效果。

票数 9
EN

Stack Overflow用户

发布于 2011-11-23 01:34:19

您可以使用联合进行类型双关,这会处理可能的对齐和别名问题(C99:TC3明确提到这确实是合法的):

代码语言:javascript
复制
#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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8230356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档