我不明白为什么这不打印“这是一个测试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 %dn", 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,因为在这种情况下,您不知道参数的确切类型)。
以上就是c/c++开发分享传递和使用可变数量的参数在C中起作用相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560181.html