在C中将类型作为参数赋予va_arg

时间:2013-03-23 08:46:48

标签: c types variadic-functions

va_arg(a,type)宏扩展为__builtin_va_arg(a,type),它是编译器的内置部分。

是否可以实现基于类型的功能,如果是,如何?

2 个答案:

答案 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_argtype参数通常用于获取typetype*的大小。