'C'在C中传递时被提升为'int'

时间:2014-06-01 19:12:49

标签: c

我有一个问题。我的课程中有一句话:

sprintf(buff,"Nieznany znak: %d",(char)va_arg(x, const char)); break;

为什么在编译之后我有一个错误:

error.c: In function 'error':
error.c:30:46: warning: 'char' is promoted to 'int' when passed through '...' [e
nabled by default]
  case 0xfe: sprintf(buff,"Nieznany znak: %d",(char)va_arg(x, const char)); brea
k;
                                              ^
error.c:30:46: note: (so you should pass 'int' not 'char' to 'va_arg')
error.c:30:46: note: if this code is reached, the program will abort

在我看来,一切都很好,为什么我不能那样做?

1 个答案:

答案 0 :(得分:8)

编译器刚刚告诉你为什么:

'char' is promoted to 'int' when passed through '...'

根据C语言规范,通常的算术转换应用于可变参数函数的未命名参数。因此,任何短于int的整数类型(例如boolcharshort)都会被隐式转换int; float被提升为double等。

执行编译器要求的操作(使用va_arg()并将int作为其第二个参数),否则您的代码将调用未定义的行为。