[英]C variadic function: How to specify which type to give to va_arg
在类似printf的函数中,我们使用stdarg.h
处理可变参数。
void print(int args,...){
va_list ap;
va_start(ap, args);
int i = 0;
for(i=0; i<args; i++){
printf("%d\n",va_arg(ap, int));
}
va_end(ap);
}
我们想解析格式列表(给可变参数函数的第一个参数),以跟踪格式列表中指定的参数类型,然后用适当的类型调用va_arg。
我进行第一个循环以分析格式列表,将说明字母存储到数组中。 所以我知道我们期望哪种类型,以及有多少种。
例如: ft_like_printf("Watch your %d %s\\n", 6, "Spider pig");
specifiers_list = "ds"
所以d <=> int和s <=> char *(与printf相同的说明符)
但是如何动态编码呢? 用differents类型调用va_arg的语法是什么?
我已阅读本和THAT我认为是什么我要找的,不是吗? 如果是,该怎么办? 包含枚举+联合的结构或包含联合+函数指针的结构的实际情况是什么?
为了处理不同的数据类型,我从这里开始:
typedef struct s_flist
{
char c;
(*f)();
} t_flist;
t_flist flist[] =
{
{ 's', &putstr },
{ 'i', &put_number },
{ 'd', &put_number }
};
类型不是C语言中的一等公民。
但是,您不必担心很多类型:您可以安全地将类型从unsigned
为signed
,反之亦然, char*
和void*
也是如此,因此对于基本的printf,您必须处理:
union
来救援!
typedef union
{
char as_char;
short as_short;
int as_int;
long as_long;
float as_float;
double as_double;
void* as_ptr;
} t_value;
typedef enum {
CHAR_T,
INT_T,
/* It goes on */
...
} t_type;
t_value get_value(va_list ap, t_type type) {
/* You can't avoid this step, there is no way to iterate over types */
switch (type) {
case T_CHAR:
return va_arg(ap, char);
case T_INT:
/* ... */
}
}
然后,您只需要创建一个查找表, t_type
为每个有效格式说明符存储一个函数指针和一个t_type
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.