【发布时间】:2014-01-26 04:26:17
【问题描述】:
有没有办法生成一个宏来产生数据类型列表的最大大小?
目标
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;
这适用于设备实现基本协议 ISO_HUGENUM_A 的嵌入式应用程序。设备还必须支持此协议 EXT_A0、EXT_A1、EXT_B0 的扩展。哎呀,在这种情况下,EXT_C0 很有可能出现在路上(糟糕)!
备注
这里的主要目标是让顶级系统以可扩展且安全的方式了解数据段的大小。当您需要作为数组时,很容易说 'cast as array'。但是
在系统级别(谁不提供有关协议的 eff)对该数据段进行读取、写入和检查(例如 crc)
2 年后,'EXT_C0' 可能会出现。我想给继承我的代码的可怜的灵魂留下一些在 EXT_C0 增长数据段时不会中断的东西
我希望有一个解决方案,但还没有找到。有任何想法吗?所有尺寸都将由预处理器生成,因此它似乎是宏的理想候选者。
-贾斯汀
【问题讨论】:
-
为什么你不能只使用
sizeof一些union- 就像你的DATA_SEG没有array? -
这不只是
union的正常用例吗? -
删除了 C++ 标签;谢谢。
-
依赖数组也可能导致问题 - 较小的结构会导致您的数组包含您可能会意外读取的数据,因此无论读取什么层,它仍然需要聪明。你应该坚持工会..
-
是的,这似乎是一个常见的联合用例。我最终可能会删除数组成员。然而,在这个协议的上下文以及系统如何执行 iso_hugenum_a 的情况下,数组访问是我想要的主要功能。