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
中的固定宽度整数类型添加到其中?
如果
是uint64_t
的 typedef,并且我在某个unsigned long long int
表达式中同时拥有它们,这会违背“同一泛型选择中没有两个泛型关联应指定兼容类型”吗?_Generic
是的。
如果是这样,我应该期待什么行为?编译失败?
是的。
上面的
表达式中是否有任何可能出错的地方,_Generic
不,不是目前所写的那样。
特别是如果我将
中的固定宽度整数类型添加到其中?stdint.h
是的,那么你就会遇到问题,因为你will然后多次指定相同的类型,程序将无法编译。