gpt4 book ai didi

在编译时在 const struct 类型之间转换

转载 作者:太空宇宙 更新时间:2023-11-04 01:27:36 25 4
gpt4 key购买 nike

给定一个 API 中的常量结构,在其他 API 中将被解释为 16 个连续的 uint8_t 字节,C 中是否有一种方法可以在编译时进行这种转换:

我想实现的是这样的

 const union {
struct a {
uint32_t a;
uint16_t b;
uint16_t c;
uint8_t d[8];
} a;
uint8_t b[16];
} foo = { .a = { 0x12341243, 0x9898, 0x4554,
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 } } };

struct from_other_api manifest = {
.appuuid = foo.b;
// { foo.b[0], foo.b[1], ... }
};

不幸的是,这种方法以及注释行中的第二个版本都给出了错误 error: initializer element is not constant,尽管这肯定看起来像一个常量.

业务原因是定义 struct from_other_api manifest 和常量内存 blob 都来自 API,不可修改。转换可以手动完成

struct from_other_api manifest = {
.appuuid = { 0x43, 0x12, 0x34, 0x12, 0x98, 0x98, 0x54, 0x45,
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }
};

但要避免,因为这是一种需要自动化的常规模式。

最佳答案

这个声明没有声明变量。

struct a {
uint32_t a;
uint16_t b;
uint16_t c;
uint8_t d[8];
};

要在 union 中声明一个名为 a 且具有相同结构的变量,请使用:

const union {
struct {
uint32_t a;
uint16_t b;
uint16_t c;
uint8_t d[8];
} a; // now a is accessible with a.a, a.b, a.c and a.d[i].
uint8_t b[16];
} foo = { .a = { 0x12341243, 0x9898, 0x4554,
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 } } };

关于在编译时在 const struct 类型之间转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28449005/

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