тип переменного аргумента в функции va arg в c

Я получаю предупреждение от компилятора 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("%cn",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

2 ответов


аргументов variadic функции претерпевают по умолчанию аргумент акции все, что меньше int (например,char) сначала преобразуется в элемент intfloat превращается в double).

так va_arg(li,char) никогда не правильно; используйте .


Да,это похоже на причуду в стандарте C. Однако, похоже, это связано только с va_arg().

Вы можете взглянуть на различные реализации printf() чтобы увидеть, как справиться с этой проблемой. Например,один в klibc очень легко читается.