简体   繁体   中英

variable argument type in va_arg function in c

I'm getting a warning by the gcc compiler and the program aborts if the following code is executed I couldn't get why? Would be great help if someone clarified it.

#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 tells me this:

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

Arguments to variadic functions undergo default argument promotions ; anything smaller than an int (such as char ) is first converted to an int (and float is converted to double ).

So va_arg(li,char) is never correct; use va_arg(li,int) instead.

Yes, this appears to be a quirk in C standard. However, it looks like this is only to do with va_arg() .

You can take a look at various implementations of printf() to see how to overcome this. For example, the one in klibc is pretty easy to read.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM