当前位置:  开发笔记 > 程序员 > 正文

将省略号传递给另一个可变参数函数

如何解决《将省略号传递给另一个可变参数函数》经验,为你挑选了2个好方法。

我有大约30个可变函数.每个人都接受一个路径作为最终参数,例如:

bool do_foo(struct *f, int q, const char *fmt, ...)

在每个函数中,我必须检查扩展格式是否小于或等于特定大小.所以,我发现自己复制/粘贴相同的代码块来检查vsnprintf()没有打印多少个字符,相应地设置并保留errno写入.

我想要做的是编写一个函数来执行此操作,这将返回一个已知为安全大小的静态分配(扩展)字符串,或者在失败时新初始化的字符串,可以针对NULL进行检查.检查还必须确定字符串是绝对路径还是相对路径,这会影响字符串的安全大小.这是很多重复的代码,它开始闻起来.

有没有办法可以将elipsis的内容从我的函数的条目传递给另一个函数?或者我必须先调用va_start(),然后传递va_list给辅助函数?

编辑:

我完全不反对把它传递va_list给帮助者,我只是想确保没有别的东西存在.在我看来,编译器理解可变参数的开始位置,所以我只是好奇我是否可以告诉它传递它们.



1> Adam Rosenfi..:

你不能,你只能传递参数作为va_list.请参阅comp.lang.c常见问题解答.

通常,如果你在C中编写可变参数函数(即带有可变数量参数的函数),你应该为每个函数编写两个版本:一个采用省略号(...),另一个采用va_list.采用省略号的版本应该调用va_start,调用版本va_list,调用va_end,调用和返回.两个版本的函数之间不需要代码重复,因为一个调用另一个.


如果你写出代码会很好.
没关系,想通了 - 我需要在每次后续使用中使用`va_copy`.

2> qrdl..:

可能你可以使用可变参数宏 - 像这样:

#define FOO(...)  do { do_some_checks; myfun(__VA_ARGS__); } while (0)

NB!Variadic宏只是C99

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有