在C中向函数传递和使用可变数量的参数

在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(

我不明白为什么它没有像我期望的那样打印出“这是一个测试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(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);