variadic函数-如何确保参数正确传递



是否有任何方法(内置或代码模式(可以确保变量函数传递正确数量的参数?(很明显,这将作为API的一部分,我可以检查我自己的内部代码。(

我正在考虑要求UN32幻数作为最后一个通过的参数,并在变差函数中检查其有效性。有人对此有什么想法吗?

va_*宏只是从本地堆栈中弹出变量,因此您必须信任用户。我认为传递数组/大小元组可能更安全。

您可以使用PP_NAMERG宏半自动添加计数。

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);

在C或C++中没有明确的方法来确保将正确数量的参数传递给变元函数。即使要求签名也不能保证有效,因为它可能与有效参数的值冲突。传递向量<>可能会更好因为检索到的元素计数是准确的。

您不能将C++0x的可变模板功能应用于函数吗?这将生成一个类型安全的vararg函数。

请参阅此链接及其使用可变模板函数的类型安全printf实现

http://www2.research.att.com/~bs/C++0xFAQ.html#可变模板

这取决于你所说的"确保变量函数传递正确数量的参数"。。。

传递UN32幻数作为最后一个参数将允许您确定参数列表的结束位置,以及它们的总数。因此,通过计算在UN32之前找到的参数数量,您就知道有多少个参数,您的函数应该知道它是否足够。不知道在运行时确定是否可以(可能为时已晚(。。。

无论如何,通常变元函数都有一个固定的参数列表部分,表示强制参数(至少一个(;因此,这可能是确保函数获得正确数量的参数的方法。。。

否。不可能。

Variadic以一种无法修复的方式破坏了类型安全。

如果你想恢复类型安全,那么可以考虑将varadic函数分解为几个类型安全〔small〕类的成员函数,该函数在调用之间保持共享状态。

这总是可能的,即使多个呼叫与单个变体相比可能看起来很尴尬呼叫

共享状态可能是您最初想要变差函数的原因。

以iostream与printf为例。

相关内容

最新更新