【发布时间】:2015-02-18 23:12:49
【问题描述】:
我在下面写了一个 C 程序来调用具有可变数量参数的函数。
#include<stdio.h>
#include<stdarg.h>
void display(int, int, ...);
int main()
{
display(1,5,1,2,3,4,5);
display(2,3,'A','B','C');
printf("\n");
return 0;
}
void display(int type, int tot_num, ...)
{
int i, j;
char c;
va_list ptr;
va_start (ptr, tot_num);
switch(type)
{
case 1:
for (j=0; j<tot_num; j++)
{
i = va_arg (ptr, int);
printf("%d ",i);
}
break;
case 2:
for (j=0; j<tot_num; j++)
{
c = va_arg(ptr, char);
printf("%c ",c);
}
}
}
但是,当我编译程序时,我收到了来自 gcc 的以下警告。
-bash-4.1$ gcc varArg3.c
varArg3.c: In function âdisplayâ:
varArg3.c:41: warning: âcharâ is promoted to âintâ when passed through â...â
varArg3.c:41: note: (so you should pass âintâ not âcharâ to âva_argâ)
varArg3.c:41: note: if this code is reached, the program will abort
-bash-4.1$
第 41 行是c = va_arg(ptr, char);
当我阅读 va_arg 的 man 3 页面时,它被提到如下:
如果没有 next 参数,或者 type 与实际 next 参数的类型不兼容(根据默认参数提升),则会发生随机错误。
当我读到这篇文章时,我认为c = va_arg(ptr, char); 是正确的,因为变量参数列表中的数据是 characters 。但是 gcc 的上述警告表明传递的变量参数不是真正的字符而是整数。
按照 gcc 的建议,我将其更改为 c = va_arg(ptr, int);,现在我没有收到任何警告。当我运行程序时,我也会得到预期的输出。
那么,字符(在main() 中对diplay() 的第二次调用)是否作为整数传递给display()?
谢谢。
【问题讨论】:
-
据我记得,char literals(您正在传递的)实际上在 C 中存储为 int 类型。如果这是错误的,我相信有人会纠正我。
-
是的,
'A'是int。另外,stackoverflow.com/questions/1255775/… -
@LeeDanielCrocker 感谢您的链接。会经历的。
标签: c gcc integer character variadic-functions