我希望能够接受
的功能foo(...)
{
//......
}
这个用法是
foo(1,2,3);
foo(1)
foo(1,2,3,4,5,5,6);
可以使用 va_list
,但我必须再次传递foo(int count, ...)
,因为在运行时我不知道我有多少参数。
任何指针都会受到赞赏
由于
答案 0 :(得分:3)
你需要提供函数一些方法来确定它被调用的参数数量:或者是一个计数(或者可以确定计数的东西,例如printf
的格式参数)或终结符(除了最后一个必须完全等于终结符之外,不允许任何参数等于终结符)。当函数的可变参数 完成时,该函数不能只知道“魔术”。
答案 1 :(得分:2)
C和C ++中的变量函数不是类型安全的。因此,如果没有某些机制来标记参数列表的结尾,则无法执行您想要的操作。您还需要至少有一个“固定”参数,以便宏可以知道参数列表的开头在内存中的位置。
这就是为什么将“count”作为第一个参数传递是有用的:它在一次击中中解决了这两个问题。
请注意,对于像printf
这样的东西,它可以正常运行,因为格式字符串是固定参数,而变量参数的“count”隐含在格式字符串中。
答案 2 :(得分:1)
在C中运行时构建参数列表不是可能,因此绝对可以肯定您知道每次调用f()
时在编译时使用了多少个参数。< / p>