可变功能 - 如何确保参数正确传递

时间:2011-07-25 20:24:30

标签: c++ c variadic-functions

有没有办法(内置函数或代码模式)确保为可变参数函数传递正确数量的参数? (显然,这将作为API的一部分包含在内,我可以查看自己的内部代码。)

我正在考虑要求UN32 Magic Number成为传递的最后一个参数,并检查可变参数函数的有效性。有没有人对此有任何想法?

6 个答案:

答案 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为例。