c实现编译时检测结构体大小

静态断言(_Static_assert)是在C11标准中引入的,它允许在编译时检查某些条件是否为真。如果条件为假,则编译器会报错。

通过下面这段代码的目的是兼容C11标准之前的编译器,它定义了一个宏STATIC_ASSERT,用来在编译时检查条件COND是否为真。如果COND为假,则编译器会报错,错误信息为MSG

 

#if (__STDC_VERSION__ >= 201112L) // 如果是c11 标准
#define STATIC_ASSERT(COND, MSG) _Static_assert(COND, MSG)
#else // 如果是 c11 标准之前的,例如c99,c89
// 连接标记并生成唯一标识符的宏
// 实现方式是将一个基本名称与当前行号结合起来。
#define TOKENPASTE(x, y) x##y
#define TOKENPASTE2(x, y) TOKENPASTE(x, y)
#define UNIQUE_STATIC_ASSERT_ID TOKENPASTE2(_static_assertion_, __LINE__)

// 旧编译器的自定义静态断言实现
// 这会生成具有唯一标识符的typedef。
// 如果条件为false,它会尝试创建一个大小为-1的数组,这将导致编译时错误。
#define STATIC_ASSERT(COND, MSG) \
    typedef char __attribute__((unused)) UNIQUE_STATIC_ASSERT_ID[(COND) ? 1 : -1]
#endif // (__STDC_VERSION__ >= 201112L)

 

例子:

我有一个结构体,编译时实现对大小的检测等

typedef struct {
    u32 data[4];
} __attribute__((packed)) test;

STATIC_ASSERT((sizeof(test) == 8), "test structure size is not 8byte!");

 

posted @ 2024-10-14 11:28  年华似水゛  阅读(175)  评论(0)    收藏  举报