0

这是我的代码:

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 编译后失败,我缺少什么?

4

3 回答 3

3

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

于 2013-01-05T21:37:42.997 回答
1

当我编译你的例子时(在修复 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:注意:如果达到此代码,程序将中止

所以这里不足为奇。

于 2013-01-05T21:41:38.340 回答
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 类型和“较小”类型(short、char)的参数。

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

于 2014-02-28T22:51:17.060 回答