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

标签 c variadic-functions

<分区>

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

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

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

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

有没有一种方法可以将省略号的内容从我的函数入口传递到另一个函数?还是必须先调用 va_start(),然后将 va_list 传递给辅助函数?

编辑:

我一点也不反对将 va_list 传递给助手,我只是想确保不存在其他任何东西。在我看来,编译器知道可变参数从哪里开始,所以我很好奇我是否可以告诉它传递它们。

最佳答案

你不能,你只能将参数作为 va_list 传递。查看comp.lang.c FAQ .

一般来说,如果您在 C 中编写可变参数函数(即,采用可变数量参数的函数),您应该为每个函数编写两个版本:一个采用省略号(... ),还有一个接受 va_list。带省略号的版本应该调用va_start,调用带va_list的版本,调用va_end,然后返回。函数的两个版本之间不需要代码重复,因为一个调用另一个。

关于c - 将省略号传递给另一个可变参数函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/695982/

相关文章:

c# - 调用可变参数方法

c++ - 如何找到参数包的长度?

c - "undefined reference to"C header 中的一个函数,但不是另一个函数

c - C如何检索具体的ASCII值?

c++ - Eclipse CDT C/C++ : Include a header file from another project

c++ - 在可变参数模板中实现 STL 函数

c - "functions with a variable number of parameters"是什么意思?

cs50x马里奥金字塔不画

c# - 随机方向,没有重复..(错误描述)

Android 和 Kotlin 可变参数 : formatted strings returns garbage