了解 C11 的_Generic

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

C17 标准要求,在

_Generic
表达式中,

同一属属选择中的两个属属关联不得 指定兼容类型。控制表达式的类型是 表达式的类型,就像它经过了左值转换一样 [...]

@Davilsor 在这篇文章中:https://codereview.stackexchange.com/a/289337/265278 指出:

_Generic
实际上只是为了使
<math.h>
的实现更加可移植,所以我并不完全信任它的整数类型。我会特别警惕
char
short int
扩大到
int

如果

uint64_t
typedef
表示
unsigned long long int
,并且我在某个
_Generic
表达式中同时拥有它们,这会违背“同一泛型选择中没有两个泛型关联应指定兼容类型”吗?如果是这样,我应该期待什么行为?编译失败?未定义的行为?诊断?

以此为例:

#define map(count, iter, func) _Generic (*iter,   \
                                char: map_c,    \
                                unsigned char: map_uc,  \
                                short int: map_si,   \
                                unsigned short int: map_usi,    \
                                int: map_i, \
                                unsigned int: map_ui,   \
                                long int: map_li,   \
                                unsigned long int: map_uli, \
                                long long int: map_lli,     \
                                unsigned long long int: map_ulli,   \
                                float: map_f,   \
                                double: map_d,  \
                                long double: map_ld,    \
                                _Bool: map_b,    \
                                char *: map_s   \
                            )(count, iter, func)

上面的

_Generic
表达式中是否有任何可能出错的地方,特别是如果我将
stdint.h
中的固定宽度整数类型添加到其中?

c generics c11
1个回答
0
投票

如果

uint64_t
unsigned long long int
的 typedef,并且我在某个
_Generic
表达式中同时拥有它们,这会违背“同一泛型选择中没有两个泛型关联应指定兼容类型”吗?

是的。

如果是这样,我应该期待什么行为?编译失败?

是的。

上面的

_Generic
表达式中是否有任何可能出错的地方,

不,不是目前所写的那样。

特别是如果我将

stdint.h
中的固定宽度整数类型添加到其中?

是的,那么你就会遇到问题,因为你will然后多次指定相同的类型,程序将无法编译。

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