Кажется, что это ограничение glibc, стандарт C не имеет этого.
Идея, лежащая в основе этого, состоит в том, что целочисленные типы, имеющие так называемый «рейтинг преобразования», меньший, чем int
, автоматическиповышен до signed
или unsigned
int
.Затем функция va_arg находит такой более широкий аргумент.Макрос va_arg
должен сначала прочитать более широкий аргумент, скажем, типа int
, а затем привести его к исходному типу.
(То же самое относится к float
по отношению к double
.)
Для неопытного программиста это может привести к неожиданным результатам, поэтому я согласен с идеей, что этого следует избегать.Описание, которое вы цитируете, по-видимому, подразумевает, что оно навязано, чтобы не использовать маленький тип.Это подделка и, как я уже сказал, не в соответствии со стандартом.С другой стороны, если вы пишете код так, как он предлагает, у вас никогда не будет проблем с переносимостью, потому что это ограничение, а не расширение.