此问题在此处已有答案:
Forward an invocation of a variadic function in C(13个答案)
9年前关闭。
我有大约30个变量函数。每一个都接受一个路径作为最终参数,例如:
bool do_foo(struct *f, int q, const char *fmt, ...)
字符串
在每个函数中,我必须检查扩展格式是否小于或等于某个大小。因此,我发现自己复制/粘贴了相同的代码块来检查vsnprintf()
没有打印多少字符,相应地设置errno
并退出写入。
我想做的是写一个函数来做这件事,它将返回一个静态分配(扩展)的字符串,已知是一个安全的大小,或新初始化的字符串失败,可以检查是否为NULL。检查还必须确定字符串是绝对路径还是相对路径,这会影响字符串的安全大小。有很多重复的代码,而且已经开始发臭了。
有没有一种方法可以将elipsis的内容从函数的入口传递到另一个函数?还是必须先调用va_start()
,然后将va_list
传递给helper函数?
编辑:
我并不反对将va_list
传递给helper,我只是想确保没有其他东西存在。在我看来,编译器理解变量参数从哪里开始,所以我只是好奇,我是否可以告诉它沿着。
4条答案
按热度按时间hl0ma9xz1#
不能,只能将参数作为
va_list
传递。参见comp.lang.c FAQ。一般来说,如果你用C编写可变参数函数(即接受可变数量参数的函数),你应该为每个函数编写两个版本:一个采用省略号(
...
),另一个采用va_list
。带有省略号的版本应该调用va_start
,调用带有va_list
的版本,调用va_end
,然后返回。两个版本的函数之间不需要重复代码,因为一个调用另一个。一个简单的用例可能是:
字符串
mwg9r5ms2#
也许你可以使用variadic宏-像这样:
字符串
**注意!**Variadic宏仅适用于C99
hm2xizp93#
我不知道这是否有帮助,你可以通过引用访问变量。这是一种狡猾的技巧,但不幸的是,它不允许您在最终的函数定义中使用省略号。
字符串
在我的pc上它输出
型
0tdrvxhp4#
你必须将va_list传递给helper。