gpt4 book ai didi

c - 使用宏的泛型编程 : tricks to determine type?

转载 作者:太空狗 更新时间:2023-10-29 17:02:13 27 4
gpt4 key购买 nike

可以在 C 中将某些类型的泛型函数作为宏来执行,例如:

#define SQRT(x) (sizeof(x) == sizeof(float) ? sqrtf((x)) : \
sizeof(x) == sizeof(double) ? sqrt((x)) : \
sqrtl((x)) )

只要 x 是浮点类型,这(大部分)就可以按预期工作。

但是,如果我想要一个可以采用整数类型或指针类型(可能具有相同的大小)的泛型宏,该怎么办?有没有聪明的方法来测试宏参数是整数还是指针?整数与浮点类型怎么样?

最佳答案

您可以检测表达式是整数表达式还是 char* 表达式,至少在从指针转换为 uintptr_t 的架构定义明确:

#define INT_OR_CHARP(X) (((uintptr_t)((X)+1) - (uintptr_t)(X)) == 1)

这将检测 X 是否是指向 sizeof(T) > 1 的类型 T 的指针。这不适用于 void* 和其他极端情况。因为 X 被计算了两次,所以你必须注意副作用。

如果 Xsigned int 类型,为避免整数溢出问题,您可以将 (X) 替换为

(1 ? (X) : (uintmax_t)0)

这保证如果 X 是一个整数表达式,它将是 uintmax_t 类型。 +1 可能会回绕,但结果始终定义明确,两部分之间的差值始终为 1。如果 X 是一个指针表达式,那么这是因为任何值为 0 的常量整数表达式也是一个空指针常量

总的来说

#define INT_OR_CHARP(X) (((uintptr_t)((1 ? (X) : (uintmax_t)0)+1) - (uintptr_t)(1 ? (X) : (uintmax_t)0)) == 1)

关于c - 使用宏的泛型编程 : tricks to determine type?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4331474/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com