You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在宏中检测整数常量表达式?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:13:13