我定义了两个数据结构,它们必须彼此保持相同大小,以使应用程序正常运行。该结构用于在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/

10-11 22:38
查看更多