是否有任何方法(内置或代码模式(可以确保变量函数传递正确数量的参数?(很明显,这将作为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为例。