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

可变参数函数的参数经过默认参数提升;任何小于 an int(例如char)的东西都会首先转换为 an 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 回答