gpt4 book ai didi

c - 严格的别名警告 : typecasting uint64_t variable to a 64-bit sized structure

转载 作者:行者123 更新时间:2023-12-05 09:06:08 25 4
gpt4 key购买 nike

我正在努力解决 Linux (4.19.21-linux-gnu-gcc) 上 C 程序中的以下问题,

//Structure definition :

struct data_from_u64 {
uint32_t u32_value;
uint16_t u16_value;
uint8_t u8_value1;
uint8_t u8_value2;
}

//Expectation : Convert a incoming uint64_t variable to the above structure using the below macro,

#define U64_TO_STRUCT(u64_value) ( * (data_from_u64 *) ((void*) &(u64_value)) )

//Usage
data_from_u64 data = U64_TO_STRUCT(u64_value);

项目庞大,应用广泛,但新的编译程序在编译时强制执行“-O2”和“-Werror”标志。你能帮忙解决下面提到的错误/警告吗?更改应该是最小的,因为这个宏在 1000 多个地方使用。

错误/警告:

错误:取消引用类型双关指针将打破严格别名规则 [-Werror=strict-aliasing]#define U64_TO_STRUCT(u64_value) ( * (data_from_u64 ) ((void) &(u64_value)) )

我尝试了什么:

我试过做 memcpy,它有效。但它需要在所有 1000 个使用位置进行更新[它需要更改宏的参数以包含目的地]。

最佳答案

memcpy 或不正确的别名的替代方法是使用带有复合文字的 union :

#define U64_TO_STRUCT(u64_value) \
((union { uint64_t u; struct data_from_u64 s; }) { u64_value } .s)

关于c - 严格的别名警告 : typecasting uint64_t variable to a 64-bit sized structure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66328980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com