如何在宏中检测整数常量表达式?Linux内核邮件列表方案解析
检测整数常量表达式的纯C宏实现
嘿,刚好之前在Linux内核邮件列表里看到过这个超有意思的讨论——如何编写一个既能检测参数是否为整数常量表达式,自身又属于整数常量表达式的宏。Martin Uecker受glibc的tgmath.h启发,搞出了一个完全不依赖编译器内置函数的巧妙实现:
#define ICE_P(x) (sizeof(int) == sizeof(*(1 ? ((void*)((x) * 0l)) : (int*)1)))
核心逻辑说明
当传入的参数x是整数常量表达式时:
(x)*0l会被编译期计算为值为0的整数常量表达式,根据C标准,常量0可以合法转换为void*类型的空指针;- 三目运算符
1 ? A : B会选择第一个分支(void*类型的空指针),由于指针类型兼容规则,最终会被隐式转换为和第二个分支一致的int*类型; - 解引用该指针后得到
int类型,sizeof(int)与自身相等,因此整个宏的结果是值为1的整数常量表达式。
如果x不是整数常量表达式,(x)*0l无法被编译期确定为常量0,将其转换为void*会违反C标准的约束,编译器会直接报错,从而实现了对整数常量表达式的检测。
内容的提问来源于stack exchange,提问作者Acorn
相关产品推荐
相关产品推荐

