这是我的代码:
void a_simple_func_with_variable_argument(int, ...);
void a_simple_func_with_variable_argument(int start, ...) {
va_list pa;
char ch;
va_start(pa, start);
while(ch = va_arg(pa, char)) {
printf("%c, ", ch);
}
printf("End\n");
va_end(pa);
}
...
//call the func above in somewhere
a_simple_func_with_variable_argument(1, 'a', 'b', 'c', '\0');
gcc编译后失败了,我错过了什么?
答案 0 :(得分:3)
你需要小心char
;它在可变参数函数中自动提升为int
。您需要将int
作为第二个参数传递给va_arg
。
答案 1 :(得分:1)
当我编译你的例子(修复va_arg(pa,char)之后),编译器(gcc 4.6)告诉我
a.c:在函数'a_simple_func_with_variable_argument'中:
a.c:8:14:警告:'char'在通过'...'时被提升为'int'[默认启用]
a.c:8:14:注意:(所以你应该将'int'而不是'char'传递给'va_arg') a.c:8:14:注意:如果达到此代码,程序将中止
所以这并不奇怪。
答案 2 :(得分:0)
int func(char a, char b, char c) /* DEMONSTRATION that char on stack is promoted to int !!!
note: this promotion is NOT integer promotion of literals, but promotion during handling of the stack. don't confuse the two */
{
const char *p = &a;
printf("a=%d\n"
"b=%d\n"
"c=%d\n", *p, p[-(int)sizeof(int)], p[-(int)sizeof(int) * 2]); // don't do this. might probably work on x86 with gcc (but again: don't do this)
}
邮件为va_arg(ap, char)
,va_arg(ap, short)
错误。
改为使用va_arg(ap, int)
:它将处理int和"较小"类型的参数。 type(short,char)。
另见http://publications.gbdirect.co.uk/c_book/chapter9/stdarg.html 引用:"请注意避免因算术转换而导致的问题。使用char或short作为va_arg的第二个参数总是一个错误:这些类型总是提升为signed int或unsigned int之一,而float转换为double。"