va_arg(a,type)
宏扩展为__builtin_va_arg(a,type)
,它是编译器的内置部分。
是否可以实现基于类型的功能,如果是,如何?
答案 0 :(得分:3)
请注意va_arg无法确定实际的类型 传递给函数的参数,但使用传递的任何类型 类型宏参数作为其类型。
让我们看看va_arg
的工作原理,here的一种可能性
#define va_arg(ap,t) (*(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))
首先,它是一个MACRO而不是一个功能。
如果您希望编写与var_arg
相同的基本类型MACRO,则您有两个主要工具, pointers
和 sizeof
您可以使用sizeof
步骤增加/减少/查找指针。
答案 1 :(得分:3)
使用预处理器,您确实可以实现基于类型的功能,尽管它是有限的。不要忘记#define
指令使用复制/粘贴,因此您无法比较C标准中的类型,例如(*)。
但是,您可以重用type
参数来构建类型泛型函数。以下是min
泛型函数的示例:
#define DEFINE_MIN(type) \
int min_##type(type a, type b) \
{ return a < b ? a : b; }
顺便说一句,gcc
扩展名typeof
给出了表达式的类型(它不再依赖于程序员参数)。此外,最近,C11 _Generic
关键字允许您为不同类型的表达式编写不同的处理方法。
(*)对于va_arg
,type
参数通常用于获取type
和type*
的大小。