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

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

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

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

我想要做的是写一个函数来做到这一点,这将返回一个已知是安全大小的静态分配(扩展)的string,或者失败时新初始化的string,可以检查NULL。 检查还必须确定string是绝对path还是相对path,这会影响string的安全大小。 这是很多重复的代码,它开始闻起来。

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

编辑:

我完全不反对把va_list传递给帮手,我只是想确保没有其他的东西存在。 在我看来,编译器明白可变参数开始的位置,所以我只是好奇,如果我能告诉它通过它们。

你不能,你只能通过参数作为va_list 。 请参阅comp.lang.c常见问题 。

一般来说,如果你在C中编写可变参数函数(也就是说,函数的参数可变),你应该写两个函数版本:一个采用省略号( ... ),另一个采用一个va_list 。 采取省略号的版本应该调用va_start ,调用va_list的版本,调用va_end并返回。 这两个版本的函数之间没有必要重复代码,因为一个调用另一个。

也许你可以使用可变macros – 像这样:

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

NB! Variadicmacros只有C99

您必须将va_list传递给帮助程序。

我不知道这是否有帮助,你可以通过引用访问variables。 这是一种偷偷摸摸的把戏,但不幸的是,它不允许你在最终的函数定义中使用省略号。

 #include <stdio.h> void print_vars(int *n) { int i; for(i=0;i<=*n;i++) printf("%X %d ", (int)(n+i), *(n+i)); printf("\n"); } void pass_vars(int n, ...) { print_vars(&n); } int main() { pass_vars(4, 6, 7, 8, 0); return 0; } 

在我的电脑输出

 $ ./a.out BFFEB0B0 4 BFFEB0B4 6 BFFEB0B8 7 BFFEB0BC 8 BFFEB0C0 0