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

How to optionally pass variable arguments in C

考虑以下函数:

void foo(int n,...);

我需要调用这个函数,"optionally" 传递变量参数。

可能吗?

像这样:

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

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

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

单独调用:

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

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

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

另一种方法,将其压缩成一个三元运算符,是可能的,但被许多人认为不可读(当然只是一个意见问题)并且不需要您在问题中显示的返回 void 的原型。

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

这些适用于两种模式之一

地图模式

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

终止模式

可以编写一个函数来对一组参数求和,这些参数具有检测终止符的某种机制。

int sum( int first_arg, ... );

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

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

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

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