作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
可以在 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
被计算了两次,所以你必须注意副作用。
如果 X
是 signed 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/
我是一名优秀的程序员,十分优秀!