在C中向函数传递和使用可变数量的参数
我不明白为什么它没有像我期望的那样打印出“这是一个测试42”在C中向函数传递和使用可变数量的参数,c,C,我不明白为什么它没有像我期望的那样打印出“这是一个测试42” 1 #include <stdio.h> 2 #include <stdarg.h> 3 4 #define ME(x) blah x 5 6 void blah(const char *fmt, ...) 7 { 8 va_list arg; 9 10 va_start(arg, fmt); 11 printf(
1 #include <stdio.h>
2 #include <stdarg.h>
3
4 #define ME(x) blah x
5
6 void blah(const char *fmt, ...)
7 {
8 va_list arg;
9
10 va_start(arg, fmt);
11 printf(fmt, arg);
12 va_end(arg);
13 }
14
15 int main()
16 {
17 ME(("this is a test %d\n", 42));
18
19 return 0;
20 }
您想调用vprintf()而不是printf()。您应该使用va_arg来获取实际的参数值。Va_start只是arg变量的初始化。Arg实际上是指向堆栈上的值的指针,而不是值本身 下一行获取实际值:
int myvalue = va_arg(arg,int);
请注意,我得到的是int而不是short,因为short由C编译器自动提升为int
编辑:Uli的答案也是正确的。如果要将多个值传递给printf,应该调用vprintf而不是printf(然后不需要调用va_arg,因为在这种情况下,您不知道参数的确切类型)。非常感谢!在linux内核中,我假设也有vprintk?似乎是这样,通过谷歌搜索“内核vprintk”发现:
int myvalue = va_arg(arg,int);