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

问题描述 投票:0回答:3

考虑以下功能:

void foo(int n,...);

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

可能吗?

像这样的东西:

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

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

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

c variadic-functions
3个回答
2
投票

只要你有正确的原型和定义的被调用函数(不容易......), 使用一个或两个参数调用它,具体取决于条件:

if(bIsJobDone)
{    foo(10, "OK");
} else
{    foo(10);
}

将其挤压成三元运算符的替代方案是可行的,但被许多人认为是不可读的(当然只是意见问题),并且在您的问题中显示的空洞返回原型不需要。


0
投票

单独调用它:

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


0
投票

如果已为可变数量的参数(例如printf)编写函数,则可以将可变数量的参数传递给函数。

它们适用于两种模式中的任何一种

地图模式

与printf一样,早期的非可选参数描述了已添加的其余参数。然后将它们从堆叠中适当地拔出。

终止模式

可以编写函数来对一组参数求和,这些参数具有一些用于检测终结符的机制。

int sum( int first_arg, ... );

将特殊标记添加到函数以正确调用的位置。

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

这是因为调用代码和被调用代码必须就使用多少堆栈达成一致。此合同中的任何差异都将导致未定义的行为,这可能意味着崩溃,或者您的程序可能被恶意行为者利用。

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

© www.soinside.com 2019 - 2024. All rights reserved.