Спецификация размера
В спецификации формата четвертое поле — это модификатор длины аргумента для описателя преобразования. Префиксы поля size для поля type (h, l, w, I, I32, I64 и ll) определяют "размер" соответствующего аргумента — длинный или короткий, 32- или 64-разрядный, однобайтовый или расширенный символ — в зависимости от описателя преобразования, который они модифицируют. Эти префиксы размера используются с символами type в семействах функций printf и wprintf для определения интерпретации длин аргументов, как показано в следующей таблице. Поле size является необязательным для некоторых типов аргументов. Если префикс размера не указан, модуль форматирования использует целые аргументы, например подписанные или не подписанные char, short, int, long, и типы перечисления как 32-разрядные типы int, а аргументы с плавающей запятой используются как 64-разрядные типы double. Это соответствует правилам повышения аргументов по умолчанию для списков аргументов переменных. Дополнительные сведения о повышении аргументов см. в разделе Многоточия и аргументы по умолчанию. Как в 32-разрядной, так и в 64-разрядной системах спецификация формата 64-разрядного целого аргумента должна включать префикс размера ll или I64. В противном случае поведение модуля форматирования не определено.
Некоторые типы имеют разный размер в 32-разрядном и 64-разрядном коде. Например, size_t на 32 бита длиннее в коде, скомпилированном для x86, и на 64 бита длиннее в коде, скомпилированном для x64. Чтобы создать код форматирования для типов с переменным количеством байт, не зависящий от платформы, можно использовать модификатор длины аргумента с переменным количеством байт. Кроме того, можно использовать 64-разрядный модификатор длины аргумента и явно повысить тип аргумента с переменным количеством байт до 64 бит. Модификатор длины аргумента I Майкрософт обрабатывает целые аргументы с переменным количеством байт.
Примечание
Префиксы-модификаторы длины I, I32 и I64 являются расширениями Microsoft и не совместимы с ANSI.Префикс h при использовании с данными типа char, префикс w при использовании с данными типа wchar_t и префикс l при использовании с данными типа double являются расширениями Microsoft.Префиксы длины hh, j, z и t не поддерживаются.
Префиксы размера для описателей формата функций printf и wprintf
Чтобы указать |
Используемый префикс |
Со спецификатором типа |
---|---|---|
long int |
l (строчная L) |
d, i, o, x или X |
long unsigned int |
l |
o, u, x или X |
long long |
ll |
d, i, o, x или X |
short int |
h |
d, i, o, x или X |
short unsigned int |
h |
o, u, x или X |
__int32 |
I32 |
d, i, o, x или X |
unsigned __int32 |
I32 |
o, u, x или X |
__int64 |
I64 |
d, i, o, x или X |
unsigned __int64 |
I64 |
o, u, x или X |
ptrdiff_t (то есть __int32 на 32-разрядных платформах, __int64 на 64-разрядных платформах) |
I |
d, i, o, x или X |
size_t (то есть unsigned __int32 на 32-разрядных платформах, unsigned __int64 на 64-разрядных платформах) |
I |
o, u, x или X |
long double (в Visual C++ хотя тип long double является отдельным типом, он имеет то же внутреннее представление, что и тип double). |
l или L |
a, A, e, E, f, g или G |
Однобайтовый символ с функциями printf и wprintf. (Описатель типа hc или hC аналогичен c в функциях printf и C в функциях wprintf.) |
h |
c или C |
Расширенный символ с функциями printf и wprintf. (Описатель типа lc, lC, wc или wC аналогичен C в функциях printf и c в функциях wprintf.) |
l или w |
c или C |
Строка однобайтовых символов с функциями printf и wprintf. (Описатель типа hs или hS аналогичен s в функциях printf и S в функциях wprintf.) |
h |
s, S или Z |
Строка расширенных символов с функциями printf и wprintf. (Описатель типа ls, lS, ws или wS аналогичен S в функциях printf и s в функциях wprintf.) |
l или w |
s, S или Z |
См. также
Ссылки
printf, _printf_l, wprintf, _wprintf_l