C语言中检测宏参数为结构体/直接类型还是指针的GCC内建函数是什么
目标内建函数
你需要找的GCC编译期类型判定内建是 __builtin_classify_type。
为什么它能解决原有判定宏的失效问题
你之前使用的判定宏 #define IS_STRUCT_SUBSTANTIAL(x) (sizeof(x) != sizeof(void *)) 本质是靠“类型内存占用大小匹配”做弱判定,只要非指针类型的大小和void*完全相等(比如64位平台下8字节长度的结构体、64位宽整数类型),就会出现误判,完全无法从类型本质上区分指针与非指针。
而__builtin_classify_type直接基于表达式的静态类型做分类,和类型的内存大小完全无关,不存在大小匹配带来的误判问题:
- 任意指针类型(包括对象指针、函数指针、类成员指针等)传入时,固定返回专属值
5,和指针的宽度、指向的具体类型没有关系 - 其他所有非指针类型(不管是基础整数/浮点类型、任意尺寸的结构体/联合体/枚举类型、空类型、函数类型等),返回值均为5之外的固定枚举值,永远不会和指针类型的返回值冲突
使用说明
- 该内建完全在编译期完成求值,不会真正执行计算传入的表达式,无任何运行时开销
- 可以基于它快速实现精准的指针类型判定宏,例如:
// 编译期精准判定表达式对应的类型是否为指针 #define IS_POINTER_TYPE(x) (__builtin_classify_type(x) == 5)
- 该内建的官方文档归类在GCC文档的类型特征章节,而非“其他内建函数”章节,因此你在后者的页面中检索不到相关条目是正常情况
内容的提问来源于stack exchange,提问作者psprint
相关产品推荐
相关产品推荐

