我在va_copy(3)中遇到了这个问题:
/* need a cast here since va_arg only * takes fully promoted types */ c = (char) va_arg(ap, int);
什么是完全推广的类型?
答案 0 :(得分:4)
这是指整数提升的规则。只要在可以使用int
的上下文中使用类型小于char
(即short
,int
)的整数值,该值就会提升为int
。
对于可变参数函数,在编译时不知道该函数的参数类型,因此适用此推广。
例如,假设您具有以下功能:
void f1(char c);
void f2(int count, ...);
它们被这样称呼:
char x = 1;
f1(x); // x is passed as char
f2(1, x); // x is passed as int
此行为记录在C standard的6.3.1.1p2节中:
以下表达式可以在表达式中使用int或unsigned 可以使用int:
- 具有整数类型(小于int或unsigned int)的整数转换等级小于的对象或表达式 或等于int和unsigned int的等级。
- 一个类型的位域 _Bool,int,signed int或unsigned int。
如果int可以表示原始类型的所有值(受宽度限制, 对于位字段),该值将转换为int;除此以外, 它被转换为unsigned int。这些被称为 整数促销。所有其他类型均未更改 整数促销。