stdarg.h和char paraments

时间:2013-01-05 21:33:30

标签: c

这是我的代码:

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

3 个答案:

答案 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。"