c 中与平台无关的 size_t 格式说明符?
-
22-09-2019 - |
题
我想打印出一个类型的变量 size_t
在 C 中,但似乎 size_t
不同架构上不同变量类型的别名。例如,在一台机器(64 位)上,以下代码不会引发任何警告:
size_t size = 1;
printf("the size is %ld", size);
但在我的另一台机器(32 位)上,上面的代码会产生以下警告消息:
警告:格式“%ld”期望类型“长int *”,但参数3具有'size_t *'的类型
我怀疑这是由于指针大小的差异造成的,因此在我的 64 位机器上 size_t
别名为 long int
("%ld"
),而在我的 32 位机器上 size_t
是另一种类型的别名。
有没有专门针对的格式说明符 size_t
?
解决方案
是的:使用 z
长度修饰符:
size_t size = sizeof(char);
printf("the size is %zu\n", size); // decimal size_t ("u" for unsigned)
printf("the size is %zx\n", size); // hex size_t
其他可用的长度修饰符是 hh
(为了 char
), h
(为了 short
), l
(为了 long
), ll
(为了 long long
), j
(为了 intmax_t
), t
(为了 ptrdiff_t
), 和 L
(为了 long double
)。请参见 C99 标准第 7.19.6.1 (7) 节。
其他提示
就在这里。这是 %zu
(如 ANSI C99 中指定)。
size_t size = 1;
printf("the size is %zu", size);
注意 size_t
是无符号的,因此 %ld
是双重错误:错误的长度修饰符和错误的格式转换说明符。如果你想知道, %zd
是为了 ssize_t
(已签名)。
微软软件定义网络, ,表示 Visual Studio 支持在 32 和 64 位平台上移植代码的“I”前缀。
size_t size = 10;
printf("size is %Iu", size);
不隶属于 StackOverflow