gpt4 book ai didi

c - 强制两个结构在编译时具有相同的大小?

转载 作者:太空狗 更新时间:2023-10-29 16:43:03 25 4
gpt4 key购买 nike

我已经定义了两个数据结构,它们必须彼此保持相同的大小才能使应用程序正常运行。这些结构用于在 PC 和 DSP 之间进行通信。 DSP代码用'C',PC端用C++。

例如:

struct inbound_data{
int header[5];
float val1;
float val2;
int trailer[3];
};

struct outbound_data{
int header[5];
int reply1;
int reply2;
float dat1;
float dat2;
int filler[1];
}

稍后我会做类似的事情:

int tx_block[sizeof(outbound_data)];
int rx_block[sizeof(inbound_data)];

这些数组将被传递给通信外设,在设备之间进行传输和接收。

由于硬件的工作原理,两个结构的大小必须匹配,这样缓冲区的大小才相等。这很容易通过适当的注意来确保,但偶尔在设计周期中,数据结构会被修改。如果一个人不是非常小心,并且意识到结构保持相同大小的要求(并且也反射(reflect)在 PC 端代码中),就会出现困惑。

我想找到一种编译时方法,如果其中一个结构被修改,使其与另一个结构的大小不匹配,则不构建代码。

这是否可能在“标准”C 中以某种方式在编译时检查大小并在它们不同时失败? (我认为我的编译器至少是 C99,可能不是 11)。

最佳答案

如果你一定要用C99,那我也是like Swordfish会建议一个宏。制作一个可以出现在任何地方并且不会引入任何对象供优化器删除的方法是将无效数组放在 typedef 中。所以一个更通用的静态断言应该是这样的:

#define CONCAT_(A,B) A##B
#define CONCAT(A,B) CONCAT_(A,B)
#define MY_STATIC_ASSERT(p, msg) typedef char CONCAT(dummy__,__LINE__) [(p) ? 1 : -1]

它旨在模仿 _Static_assert。消息被传递进来,希望编译器诊断能够显示它。它的用法示例是 here .

产生:

main.cpp:4:54: error: size of array 'dummy__13' is negative
#define MY_STATIC_ASSERT(p, msg) typedef char CONCAT(dummy__,__LINE__) [(p) ? 1 : -1]
^~~~~~~
main.cpp:2:22: note: in definition of macro 'CONCAT_'
#define CONCAT_(A,B) A##B
^
main.cpp:4:47: note: in expansion of macro 'CONCAT'
#define MY_STATIC_ASSERT(p, msg) typedef char CONCAT(dummy__,__LINE__) [(p) ? 1 : -1]
^~~~~~
main.cpp:13:1: note: in expansion of macro 'MY_STATIC_ASSERT'
MY_STATIC_ASSERT(sizeof(struct foo) == sizeof(struct baz), "Do not match!");

一直往下看,您可以看到带有消息的静态断言。


事后,您可以将 dummy__ 更改为 please_check_line_ 将生成上面更具描述性的 please_check_line_13

关于c - 强制两个结构在编译时具有相同的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52608578/

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