gpt4 book ai didi

c - 用于确定多个结构的最大大小的 GCC 预处理器宏

转载 作者:太空狗 更新时间:2023-10-29 16:12:42 24 4
gpt4 key购买 nike

有没有办法生成一个宏来产生数据类型列表的最大大小?

目标

typedef struct {
uint8_t x;
} A;

typedef struct {
uint16_t x;
} B;

typedef struct {
uint8_t x[10];
} C;

#define sizeof_max(A,B,C) //compiles to '10'

用例

通用数据段的不同值映射。

typedef union {
uint8_t array[sizeof_max(A,B,C)];
A iso_hugenum_a;
B ext_a0;
C ext_a1; //and someday down the road 'D' may also get added
} DATA_SEG;

这适用于设备实现基本协议(protocol) ISO_HUGENUM_A 的嵌入式应用程序。该设备还必须支持对此协议(protocol)的扩展 EXT_A0、EXT_A1、EXT_B0。哎呀,在这种情况下,EXT_C0 很有可能出现在路上(糟糕)!

注意事项

这里的主要目标是以可扩展和安全的方式让顶层系统知道数据段的大小。当您需要 as array 时,很容易只说'cast as array'。但是

  • 在系统级(谁不给出关于协议(protocol)的效果)对该数据段有读取、写入和检查(例如 crc)

  • 2 年后“EXT_C0”可能会出现。我想给继承我代码的可怜人留下一些在 EXT_C0 增长数据段时不会破坏的东西

我希望有一个解决方案,但还没有找到。有任何想法吗?所有大小都将由预处理器生成,因此它似乎是宏的理想候选者。

-贾斯汀

最佳答案

下面的宏定义精确地您所要求的:

#define sizeof_max(s1,s2,s3) sizeof( union{s1 a; s2 b; s3 c; })

对于您的示例结构如下:

size_t s = sizeof_max( A,B,C ) ;

结果 s = 10。

当然,当您想要作为字节数组访问时,您可以省略数组成员并简单地将 DATA_SEG 对象地址转换为 uint8_t*:

DATA_SEG x ;
uint8_t* array = (uint8_t*)&x ;

这将允许 DATA_SEG 在必要时添加更多结构而无需更改宏 - 更安全且更易于维护。


添加:

另一种可能性是将专门的解释与字节覆盖分开:

typedef union 
{
A iso_hugenum_a;
B ext_a0;
C ext_a1;
D added_someday ;
} DATA_SEG_U;

typedef union
{
uint8_t array[sizeof(DATA_SEG_U)];
DATA_SEG_U data_seg ;
} DATA_SEG ;

关于c - 用于确定多个结构的最大大小的 GCC 预处理器宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21359683/

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