我想制作一个宏来检查给定值是否是整数,并且我发现某些整数类型在使用时彼此兼容
_Generic
,因此它们不能同时用作单独的_Generic
案例。
像
int
和int32_t
或
signed char
和 int8_t
这方面的规则是什么?是否有适用于所有平台/编译器的解决方案?
我当前的代码是:
#define is_integer(exp) \
_Generic(exp, \
int8_t: 1, \
int16_t: 1, \
int32_t: 1, \
int64_t: 1, \
uint8_t: 1, \
uint16_t: 1, \
uint32_t: 1, \
uint64_t: 1, \
default: 0)
但是,它不适用于
char
(转到默认设置),但可以与 signed char
配合使用(转到 int8_t
)。
我应该添加
char
作为单独的 _Generic
案例吗?我担心某些实施 typedef
s int8_t
到 char
所以它不会工作,或者他们不允许这样做?
像
int16_t
这样的类型可以映射到任何具有适当特征(如果存在)的标准或扩展整数类型,并以任意方式选择。类似于 int_least16_t
的类型,不同之处在于对于大小为 8、16、32 和 64 的每种此类类型,每个符合要求的实现都必须至少有一个具有适当特征的标准或扩展整数类型。
如果在两个实现中
int
和long
都是32位,但其中一个恰好将int32_t
定义为int
,另一个将其定义为long
,那么在第一个实现中int32_t
将与 int
兼容,但与 long
不兼容,而第二个 int32_t
将与 long
兼容,但与 int
不兼容。