6

gccコンパイラによって警告が表示され、次のコードが実行されるとプログラムが中止されます。理由がわかりませんでしたか?誰かがそれを明らかにした場合、大きな助けになるでしょう。

#include<stdio.h>
#include<stdarg.h>
int f(char c,...);
int main()
{
   char c=97,d=98;
   f(c,d);
   return 0;
}

int f(char c,...)
{
   va_list li;
   va_start(li,c);
   char d=va_arg(li,char); 
   printf("%c\n",d);
   va_end(li);
}

GCCは私にこれを教えてくれます:

warning: 'char’ is promoted to ‘int’ when passed through ‘...’ [enabled by default]
note: (so you should pass ‘int’ not ‘char’ to ‘va_arg’)
note: if this code is reached, the program will abort
4

2 に答える 2

12

可変個引数関数への引数は、デフォルトの引数昇格を受けます; int(などの)よりも小さいものは、char最初にint(にfloat変換されます)に変換されdoubleます。

したがってva_arg(li,char)、決して正しくありません。va_arg(li,int)代わりに使用してください。

于 2012-07-04T22:36:16.370 に答える
1

はい、これはC標準の癖のようです。ただし、これは。にのみ関係しているようですva_arg()

のさまざまな実装をprintf()見て、これを克服する方法を確認できます。たとえば、klibcのものは非常に読みやすいです。

于 2014-05-22T16:45:08.153 に答える