传递和使用可变数量的参数在C中起作用

我不明白为什么这不打印“这是一个测试42”,就像我期待的那样?

1 #include  2 #include  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 } 

相反,它是这样的:

 $ gcc blah.c $ ./a.out this is a test 1606416656 

您想要调用vprintf()而不是printf()。

您应该使用va_arg来获取实际的参数值。 Va_start只是arg变量的初始化。 Arg实际上是指向堆栈上的值的指针,它不是valut本身。

以下行获取实际值:

 int myvalue = va_arg(arg,int); 

请注意,我得到一个int而不是short,因为short会被C编译器自动提升为int。

编辑: Uli的回答也是正确的。 如果要将多个值传递给printf,则应调用vprintf而不是printf(然后不需要调用va_arg,因为在这种情况下,您不知道参数的确切类型)。