【发布时间】:2023-03-16 00:54:01
【问题描述】:
我有一个函数foo(char *n, ...);
我需要获取并使用所有可选的char 参数。
我有一个想法使用
while(va_arg(argPtr, char) != NULL)
{
...
}
了解我何时到达列表末尾。那么,如果在函数调用中我会做foo(n, 't', 'm', '$', NULL);,它会起作用吗?
NULL 会被 va_arg 读取为字符吗?
或者也许有一种更常见的方法来确定列表的结尾,而不添加 NULL 作为最后一个参数?
【问题讨论】:
-
如果
n是一个格式字符串,那么您通常只需将格式说明符的数量与参数的数量相匹配,就可以像printf和家族一样行事。你确定它只是一个可变数量的chars 被传递吗?如果是这样,您可以匹配-1或0或其他东西,但由于@hvd 在下面的 cmets 中概述的原因,NULL 不是一个好主意。 -
@kekyc 如果您依赖负的
char值,那么您应该使用signed char,如果您只处理 [0, 128) 范围 (ascii) 中的值,那么 - 1 应该没问题。 -
如果你要传递一个可变长度的
char参数列表,为什么不只传递一个字符串呢? (有一些种情况下这不起作用,但这是显而易见的解决方案。) -
如果你有可变数量的相同类型的参数,由一个特殊的值终止,那么这个值需要匹配参数的类型。如果您要传递
int值,那么您需要选择一些特殊的int值,例如0 或-1。如果您要传递字符串,即char *,则需要使用(char *) NULL终止它,例如execl()需要。 -
好的,谢谢你们,给了很棒的完整答案!
标签: c variadic-functions