C语言int类型与_Generic兼容性及跨平台宏实现咨询
类型兼容性与
_Generic分支匹配规则 首先明确C标准里的核心规则:
typedef定义的类型和原类型属于兼容类型,比如int32_t如果是typedef int int32_t,它和int就是兼容类型;int8_t若为typedef signed char int8_t,则和signed char兼容。_Generic的分支匹配是按兼容类型组划分的,同一组内的类型会匹配到同一个分支,因此无法为兼容类型单独设置独立分支。char、signed char、unsigned char是三种完全独立的类型,彼此不兼容——哪怕char的有符号性由实现定义,它也不会和另外两种char类型归为同一兼容组,所以_Generic里可以给char单独开分支,不会和signed char/unsigned char冲突。
跨平台通用的整数类型判断方案
如果你的需求是判断值是否为整数类型(无需区分具体是基础类型还是stdint类型),可以直接用简化版的_Generic宏:
#define IS_INTEGER(val) _Generic((val), \ char: 1, \ signed char: 1, \ unsigned char: 1, \ short: 1, \ unsigned short: 1, \ int: 1, \ unsigned int: 1, \ long: 1, \ unsigned long: 1, \ long long: 1, \ unsigned long long: 1, \ int8_t: 1, \ uint8_t: 1, \ int16_t: 1, \ uint16_t: 1, \ int32_t: 1, \ uint32_t: 1, \ int64_t: 1, \ uint64_t: 1, \ default: 0 \ )
这个宏的逻辑很直接:所有整数类型(包括基础类型和stdint定义的类型)都会返回1,非整数类型返回0。即使某个stdint类型是基础类型的typedef(比如int32_t = int),_Generic会自动匹配到对应的基础类型分支,不影响判断结果。
如果你的需求是区分具体的整数类型(比如要区分int和int32_t),那只能在int32_t是独立类型的平台上实现——因为在int32_t是int typedef的平台上,二者属于兼容类型,_Generic无法区分。这种情况下,可以用编译期断言提前检查类型是否独立:
// 检查int32_t是否与int为同一类型,若为typedef则触发断言 _Static_assert(!__builtin_types_compatible_p(int32_t, int), "int32_t is a typedef of int, cannot distinguish");
关于添加
char独立分支的可行性 完全可以给char添加独立分支:
- 如前所述,
char和signed char/unsigned char是独立类型,_Generic会分别匹配,不会冲突。 - 若某个平台将
int8_ttypedef为char,那么int8_t会匹配到char的分支——这是符合C标准的正常行为,不会引发冲突。只是在该平台上,你无法区分char和int8_t,但这是平台实现的限制,无法绕过。
内容的提问来源于stack exchange,提问作者Abdulmalek Almkainzi
相关产品推荐
相关产品推荐

