Ищите пояснения по использованию "zd"
с printf()
.
Конечно, следующее верно для C99 и позже.
void print_size(size_t sz) {
printf("%zu\n", sz);
}
Спецификация C, кажется, позволяет printf("%zd\n", sz)
зависимости от того, как он читается:
7.21.6.1 Функция fprintf
z
Указывает, что следующий спецификатор преобразованияd
,i
,o
,u
,x
илиX
применяется кsize_t
или соответствующему аргументу целочисленного типа со знаком; или что следующий спецификатор преобразованияn
применяется к указателю на целочисленный тип соsize_t
соответствующий аргументуsize_t
. C11dr §7.21.6.1 7
Должно ли это быть прочитано как
- "
z
Указывает, что следующий спецификатор преобразованияd
... применяется кsize_t
или соответствующему аргументу соsize_t
целочисленного типа со знаком..." (оба типа) и "z
Указывает, что следующий спецификатор преобразованияu
... применяется кsize_t
или соответствующий аргумент целочисленного типа со знаком... "(оба типа)
ИЛИ ЖЕ
- "
z
указывает, что следующий спецификатор преобразованияd
... применяется к соответствующему аргументу со знаком целого типа со знаком..." (только со знаком типа) и "z
указывает, что следующий спецификатор преобразованияu
... применяется кsize_t
" (беззнаковый тип только).
Я использовал определение № 2, но теперь не уверен.
Что правильно, 1, 2 или что-то еще?
Если # 2 верно, то каков пример типа, который может использовать
"%zd"
?