【发布时间】:2021-08-11 04:22:38
【问题描述】:
我想要一个接受泛型参数的函数,这可以通过可变参数函数实现,但我正在寻找一些建议/帮助。
基本上,该函数可以接受任何原始类型(int、double、char* 等)和某些本地结构/指向它的指针。我执行了以下操作,对基本类型和结构的 ENUM 值进行硬编码。
我想出了以下解决方案,但至少对于我在 ENUM 中使用的原始类型,它看起来并不整洁。我看到vfprintf 可以在参数为const char *format, ... 的可变参数函数中使用,但是如何使用这种方法处理结构和多个参数?
enum types {LONG, INT, FLOAT, DOUBLE, CHAR, STRUCT};
typedef struct
{
int size;
char data[64];
} Pkt;
void bar(int len, va_list ap)
{
Pkt pkt = va_arg(ap, Pkt);
printf ("[Bar] packet: %d, %s\n", pkt.size, pkt.data);
}
void foo(int len, ...)
{
char *str;
double val;
int intVal;
va_list ap;
Pkt pkt;
va_start(ap, len);
bar(len, ap);
va_end(ap);
va_start(ap, len);
for (int i=0; i<len; i++)
{
int type = va_arg(ap, enum types);
switch(type)
{
case CHAR:
str = va_arg(ap, char*);
printf ("CHAR: %s\n", str);
break;
case DOUBLE:
val = va_arg(ap, double);
printf ("DOUBLE: %f\n", val);
break;
case INT:
intVal = va_arg(ap, int);
printf ("INT: %d\n", intVal);
break;
case STRUCT:
pkt = va_arg(ap, Pkt);
printf ("STRUCT: %d, %s\n", pkt.size, pkt.data);
break;
default:
break;
}
}
va_end(ap);
}
int main()
{
Pkt pkt = {.size = 50, .data = {"Hello"}};
char *str = "World";
foo(2, STRUCT, pkt, CHAR, str);
return 0;
}
【问题讨论】:
-
printf 系列在格式字符串中编码可变参数的数量和类型。你在单独的论点中做到这一点。这两种方法没有本质区别。
-
除了在我的方法中,我不仅限于传递原始类型,不是吗?
-
您可以发明自己的格式说明符而不是枚举。例如
%P用于数据包结构。 -
你有例子吗?你在用
sprintf吗?仍在阅读它,但到目前为止找不到 -
什么例子?如果你想要一个示例实现,那么只需阅读
printf系列的源代码。