我正在收到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
答案 0 :(得分:11)
可变参数函数的参数经历默认参数提升;小于int
的任何内容(例如char
)首先会转换为int
(而float
会转换为double
)。
所以va_arg(li,char)
永远不正确;请改用va_arg(li,int)
。
答案 1 :(得分:1)
是的,这似乎是C标准的一个怪癖。但是,看起来这只与va_arg()
。
您可以查看printf()
的各种实现,了解如何克服这个问题。例如,one in klibc非常容易阅读。