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に 2 番目の引数として渡す必要があります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: 注: (したがって、 'va_arg' に 'char' ではなく 'int' を渡します)
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も参照してください 。引用: "ここでは、算術変換によって発生する可能性のある問題を回避するように注意してください。va_arg の 2 番目の引数として char または short を使用すると、常にエラー: これらの型は常に signed int または unsigned int のいずれかに昇格し、float は double に変換されます。"

于 2014-02-28T22:51:17.060 に答える