【发布时间】:2021-03-06 06:18:50
【问题描述】:
以下是我能想到的将可变长度参数传递给函数的最基本示例:
int printme(int num, ...)
{
va_list ap;
va_start(ap, num);
for (int i = 0; i < num; ++i) {
char *arg = va_arg(ap, char *);
printf("%d. %s\n", i + 1, arg);
}
va_end(ap);
return 1;
}
int main(void)
{
printme(2, "X", "YY");
}
但是,请注意我将长度作为第一个参数(或任何参数)传递。是否可以将这些va_ 宏与printf-ish 函数一起使用?例如,我可以做这样的事情(不传递参数的数量吗?
print2("Hello something %s %s", "Arg 1", "Arg 2");
print2("Hello something %s %s %s", "Arg 1", "Arg 2", "Arg 3");
如果是这样,接收它的函数会是什么样子?而如果不可能,那printf又是如何实现的呢?
【问题讨论】:
-
我很确定
printf使用格式字符串来查找%字符,然后根据它们判断要做什么。例如,如果在%(意思是%s)之后有一个s,它就知道你正在这里打印一个字符串,所以它假设你传递的下一个可变参数是一个字符串。 -
当然可以。如果
printf可以,那么你也可以。只需解析格式说明符的第一个字符串 arg。就像您的第一个示例使用num一样,您可以访问字符串 arg 并对其进行解析。 -
@kaylum 哦,对了。所以它只是接收它,并通过解析字符串来检测数字以确定
count是什么。 -
@carl.hiass — 是的!
-
@carl.hiass 为了完整起见,另一种处理相同类型的可变数量参数的 C 方法是使用保留值来指示列表的结尾,例如
print3("hello", "arg 1", "arg 2", "arg 3", NULL);。
标签: c variadic-functions