有没有办法(内置函数或代码模式)确保为可变参数函数传递正确数量的参数? (显然,这将作为API的一部分包含在内,我可以查看自己的内部代码。)
我正在考虑要求UN32 Magic Number成为传递的最后一个参数,并检查可变参数函数的有效性。有没有人对此有任何想法?
答案 0 :(得分:4)
va_*
宏只是弹出本地堆栈中的变量,因此您必须信任该用户。我认为,传递数组/大小元组可能更安全。
答案 1 :(得分:3)
在C或C ++中没有确定的方法来确保将正确数量的参数传递给可变参数函数。即使需要签名也不能保证工作,因为它可能与有效参数的值冲突。传递矢量<>可能会好得多。因为检索到的元素数量是准确的。
答案 2 :(得分:3)
您可以使用PP_NARG宏半自动添加计数。
int myfunc (int count, ...);
#define MYFUNC(...) myfunc(PP_NARG(__VA_ARGS__), __VA_ARGS__)
MYFUNC(a,b,c,d);
MYFUNC(a,b,c,d,e,f,g);
gcc -E产生:
int myfunc (int count, ...);
myfunc(4, a,b,c,d);
myfunc(7, a,b,c,d,e,f,g);
答案 3 :(得分:2)
难道你不能使用C ++ 0x的可变参数模板功能应用于某个函数吗?这将生成一个类型安全的vararg函数。
使用可变参数模板化函数
查看此链接的类型安全printf实现http://www2.research.att.com/~bs/C++0xFAQ.html#variadic-templates
答案 4 :(得分:1)
这取决于你的意思“确保通过正确数量的参数传递可变参数函数”......
传递UN32 Magic Number作为最后一个参数将允许您确定参数列表的结束位置,以及它们的总数。所以,通过计算你在UN32之前找到多少个参数,你知道你有多少参数,你的函数应该知道它是否足够。不知道你是否可以在运行时确定这一点(可能为时已晚)......
无论如何,通常可变函数有一个固定的参数列表部分代表强制参数(至少一个);所以这应该是你确保函数获得正确数量的参数的方法......
答案 5 :(得分:1)
没有。不可能。
Variadic以无法修复的方式打破了类型安全。
如果您想要返回类型安全性,那么请考虑将可变参数功能分解为几种类型安全 [小]类的成员函数,用于保存其调用之间的共享状态。
这总是可行的,即使多个调用与单个可变参数相比可能看起来很尴尬 呼叫。
共享状态可能是您首先想要可变参数函数的原因。
以iostream vs printf为例。