如何有选择地在C中传递变量参数

时间:2018-09-03 06:18:01

标签: c variadic-functions

考虑以下功能:

void foo(int n,...);

我需要调用此函数,“可选地”传递变量参数。

有可能吗?

类似这样的东西:

foo(10, (bIsJobDone ? "OK" : xxx) );

如果我不必将任何变量arg传递给foo,我将无法弄清用什么代替xxx(xxx应该转换为空),以及如何避免在10之后出现“,”? / p>

注意:我无法更改“ foo”的签名。

3 个答案:

答案 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, ... );

在函数中添加了特殊标记以正确调用的地方。

如果编写的函数只接受固定数量的参数,则必须传递该数量的参数。

这是因为调用代码和被调用代码必须在使用多少堆栈上达成共识。该合同的任何差异都将导致不确定的行为,这可能意味着崩溃,或者您的程序可能被恶意行为者利用。

鉴于该函数具有一定数量的参数,您需要提供所有这些参数。