什么是完全推广型?

时间:2019-06-13 18:51:00

标签: c

我在va_copy(3)中遇到了这个问题:

/* need a cast here since va_arg only
 * takes fully promoted types */
c = (char) va_arg(ap, int);

什么是完全推广的类型?

1 个答案:

答案 0 :(得分:4)

这是指整数提升的规则。只要在可以使用int的上下文中使用类型小于char(即shortint)的整数值,该值就会提升为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。这些被称为   整数促销。所有其他类型均未更改   整数促销。