如何在 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, ... );
在函数中添加特殊标记以正确调用的地方。
如果一个函数被编写为只接受固定数量的参数,则您必须传递该数量的参数。
这是因为调用代码和被调用代码必须就使用多少堆栈达成一致。此合同中的任何差异都将导致未定义的行为,这可能意味着崩溃,或者您的程序可能会被恶意行为者利用。
鉴于函数有一定数量的参数,您需要提供所有这些参数。
考虑以下函数:
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, ... );
在函数中添加特殊标记以正确调用的地方。
如果一个函数被编写为只接受固定数量的参数,则您必须传递该数量的参数。
这是因为调用代码和被调用代码必须就使用多少堆栈达成一致。此合同中的任何差异都将导致未定义的行为,这可能意味着崩溃,或者您的程序可能会被恶意行为者利用。
鉴于函数有一定数量的参数,您需要提供所有这些参数。