4

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

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

4

2 回答 2

3

请注意,va_arg无法确定传递给函数的参数的实际类型,而是使用作为类型宏参数传递的任何类型作为其类型。

让我们看看是如何工作的,从这里开始va_arg的一种可能性是

#define va_arg(ap,t) (*(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))

首先,它是一个宏,而不是一个函数。

如果你想写一个与 相同的类型基 MACRO var_arg,你有两个主要工具,pointerssizeof.

您可以通过步骤增加/减少/查找指针sizeof

于 2013-03-23T08:52:05.500 回答
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*

于 2013-03-23T08:52:13.623 回答