C int 类型和 _Generic。哪些类型兼容?

问题描述 投票:0回答:1

我想制作一个宏来检查给定值是否是整数,并且我发现某些整数类型在使用时彼此兼容

_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
所以它不会工作,或者他们不允许这样做?

c macros
1个回答
0
投票

int16_t
这样的类型可以映射到任何具有适当特征(如果存在)的标准或扩展整数类型,并以任意方式选择。类似于
int_least16_t
的类型,不同之处在于对于大小为 8、16、32 和 64 的每种此类类型,每个符合要求的实现都必须至少有一个具有适当特征的标准或扩展整数类型。

如果在两个实现中

int
long
都是32位,但其中一个恰好将
int32_t
定义为
int
,另一个将其定义为
long
,那么在第一个实现中
int32_t
将与
int
兼容,但与
long
不兼容,而第二个
int32_t
将与
long
兼容,但与
int
不兼容。

© www.soinside.com 2019 - 2024. All rights reserved.