Что такое полностью рекламируемый тип? - PullRequest
7 голосов
/ 13 июня 2019

Я сталкивался с этим в va_copy (3):

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

Что такое полностью продвигаемый тип?

1 Ответ

4 голосов
/ 13 июня 2019

Это относится к правилам целочисленного продвижения .В любое время, когда целое значение с типом, меньшим 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

Это поведение описано в разделе 6.3.1.1p2 стандарта C :

Следующее может использоваться в выражении везде, где могут использоваться int или unsigned int:

  • Объект или выражение с целочисленным типом (отличным от int или unsigned int), чей ранг целочисленного преобразования меньше чемили равно рангу int и unsigned int.
  • Битовое поле типа _Bool, int, sign int или unsigned int.

Если int может представлять все значения исходного типа (как ограничено шириной для битового поля), значение преобразуется в int;в противном случае он конвертируется в беззнаковое целое.Они называются целочисленными акциями.Все остальные типы не изменяются целочисленными акциями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...