Tag: 可变函数

如何填写va_list

如果我有一个va_list,我知道如何提取其所有元素: void printInts(int n,…) { va_list va; va_start(va, n); for(unsigned int i=0; i<n; i++) { int arg=va_arg(va, int); printf("%d",arg); } va_end(va); } 因此,当我调用printInts(3,1,2,3)时,va_list将填充所有参数。 但是如何在不使用va_start的情况下手动填充va_list? 我的意思是我想要的东西: va_list va; push_arg(va, int, 5); // And so on until I fill all parameters … 我需要这个,因为有一个函数接受一个va_list作为参数,我不知道如何填充其所有参数的va_list。

如何计算传递给接受可变数量参数的函数的参数数量?

如何计算在以下程序中传递给函数的参数的数量: #include #include void varfun(int i, …); int main(){ varfun(1, 2, 3, 4, 5, 6); return 0; } void varfun(int n_args, …){ va_list ap; int i, t; va_start(ap, n_args); for(i=0;t = va_arg(ap, int);i++){ printf(“%d”, t); } va_end(ap); } 这个程序在ubuntu 10.04下通过我的gcc编译器输出: 234561345138032514932134513792 那怎么找多少没有。 实际传递给函数的参数?

C中的变量参数,如何获取generics类型的值?

我正在尝试使用带有generics类型的C stdarg.h lib。 int类型,是我的generics类型>要理解它,请继续阅读。 所以,我的问题是: 我有一个接受可变数量参数的函数。 喜欢 void function (int paramN, …); 在我的程序中,没有办法知道,哪个是变量参数的类型,它可以是char,数组,int,short,函数点等…就像 function (paramN, “Hey, I’m a string”, 1, function_pint, array, -1); // -1 is a sentinel. 所以,我认为,一个int,是32位,在x86(32位)系统中,这将保存所有内存地址。 所以,如果我用int得到所有参数,它就不会有问题,例如,“嘿,我是一个字符串”这个字符串的地址,通常适合32位变量,所以,我只需要制作演员。 我是正确的? 我可以做吗? 注意:我不想让我的函数像printf(这个解决方案,在这种情况下不适合好吗?) 谢谢你的回答。 抱歉我的英语不好。

GCC是否error handling了传递给函数的va_list的指针?

问题’传递va_list或指向va_list的指针?’ 有一个答案引用标准(ISO / IEC 9899:1999 – §7.15’变量参数 ,脚注212)明确地说: 允许创建指向va_list的指针并将该指针传递给另一个函数,在这种情况下,原始函数可以在另一个函数返回后进一步使用原始列表。 我正在编译一些代码,可以举例说明(实际代码非常复杂,原始函数比这里显示的工作要多得多)。 vap.c #include #include static void test_ptr(const char *fmt, va_list *argp) { int x; x = va_arg(*argp, int); printf(fmt, x); } static void test_val(const char *fmt, va_list args) { test_ptr(fmt, &args); } static void test(const char *fmt, …) { va_list args; va_start(args, fmt); /* First use […]

填充va_list

有没有办法从头开始创建一个va_list ? 我正在尝试调用一个以va_list作为参数的函数: func(void **entry, int num_args, va_list args, char *key); …来自不采用可变数量参数的函数。 我能想到的唯一方法是创建一个中间函数,它接受varargs然后传递它的va_list,这是非常愚蠢的: void stupid_func(void **entry, char *key, int num_args, …) { va_list args; va_start(args, num_args); func(entry, num_args, args, key); va_end(args); } 有没有更好的办法? 我不能改变func的签名。