静态断言(_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!");
标签:__,检测,ASSERT,编译,STATIC,大小,COND,define From: https://www.cnblogs.com/zjxcyr/p/18463701