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 @   年华似水゛  阅读(102)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示