考虑以下功能:
void foo(int n,...);
我需要调用此函数,“可选地”传递变量参数。
有可能吗?
类似这样的东西:
foo(10, (bIsJobDone ? "OK" : xxx) );
如果我不必将任何变量arg传递给foo,我将无法弄清用什么代替xxx(xxx应该转换为空),以及如何避免在10之后出现“,”? / p>
注意:我无法更改“ foo”的签名。
答案 0 :(得分:2)
只要正确地原型化和定义了被调用的函数(不容易...),
使用一个或两个参数根据条件调用它很容易:
if(bIsJobDone)
{ foo(10, "OK");
} else
{ foo(10);
}
将其压缩为三元运算符的方法是可行的,但是很多人认为它不可读(当然只是出于观点的考虑),对于问题中显示的返回空函数的原型并不需要它。
答案 1 :(得分:0)
单独调用:
bIsJobDone ? foo(10, "OK") : foo(10);
答案 2 :(得分:0)
如果为可变数量的参数(例如printf
)编写了函数,则可以将可变数量的参数传递给函数。
这些可以使用两种模式之一
像printf一样,早期的非可选参数描述了已添加的其余参数。然后将它们从堆栈中适当地拔出。
可以编写一个函数来对一组参数求和,这些参数具有某种机制来检测终止符。
int sum( int first_arg, ... );
在函数中添加了特殊标记以正确调用的地方。
如果编写的函数只接受固定数量的参数,则必须传递该数量的参数。
这是因为调用代码和被调用代码必须在使用多少堆栈上达成共识。该合同的任何差异都将导致不确定的行为,这可能意味着崩溃,或者您的程序可能被恶意行为者利用。
鉴于该函数具有一定数量的参数,您需要提供所有这些参数。