тип переменного аргумента в функции 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
) сначала преобразуется в элемент int
(и float
превращается в double
).
так va_arg(li,char)
никогда не правильно; используйте .
Да,это похоже на причуду в стандарте C. Однако, похоже, это связано только с va_arg()
.
Вы можете взглянуть на различные реализации printf()
чтобы увидеть, как справиться с этой проблемой. Например,один в klibc очень легко читается.