stdarg.h和char paraments

这是我的代码:

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编译后失败了,我错过了什么?

你需要小心char ; 它在可变参数函数中自动提升为int 。 您将需要将int作为第二个arg传递给va_arg

当我编译你的例子(修复va_arg(pa,char)之后),编译器(gcc 4.6)告诉我

ac:在函数’a_simple_func_with_variable_argument’中:
ac:8:14:警告:’char’在通过’…’时被提升为’int'[默认启用]
ac:8:14:注意:(所以你应该将’int’而不是’char’传递给’va_arg’)
ac:8:14:注意:如果达到此代码,程序将中止

所以这并不奇怪。

 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类型和“less”类型的参数(short,char)。

另请参阅http://publications.gbdirect.co.uk/c_book/chapter9/stdarg.html引用:“请注意避免可能由算术转换引起的问题。使用char或short作为va_arg的第二个参数是总是一个错误:这些类型总是提升为signed int或unsigned int之一,而float转换为double。“