c 中与平台无关的 size_t 格式说明符?
我想在 C 中打印出 size_t
类型的变量,但似乎 size_t
在不同的体系结构上别名为不同的变量类型。例如,在一台机器(64 位)上,以下代码不会引发任何警告:
size_t size = 1;
printf("the size is %ld", size);
但在我的另一台机器(32 位)上,上述代码会产生以下警告消息:
警告:格式“%ld”需要类型 'long int *',但参数 3 具有类型 'size_t *'
我怀疑这是由于指针大小的差异造成的,因此在我的 64 位机器上 size_t
被别名为 long int
(" %ld"
),而在我的 32 位机器上,size_t
是另一种类型的别名。
是否有专门针对 size_t
的格式说明符?
I want to print out a variable of type size_t
in C but it appears that size_t
is aliased to different variable types on different architectures. For example, on one machine (64-bit) the following code does not throw any warnings:
size_t size = 1;
printf("the size is %ld", size);
but on my other machine (32-bit) the above code produces the following warning message:
warning: format '%ld' expects type
'long int *', but argument 3 has type
'size_t *'
I suspect this is due to the difference in pointer size, so that on my 64-bit machine size_t
is aliased to a long int
("%ld"
), whereas on my 32-bit machine size_t
is aliased to another type.
Is there a format specifier specifically for size_t
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
是:使用
z
长度修饰符:其他可用的长度修饰符有
hh
(对于char
)、h
(对于短
),l
(对于长
),ll
(对于长长
code>)、j
(对于intmax_t
)、t
(对于ptrdiff_t
)和L< /code> (对于
long double
)。请参见 C99 标准第 7.19.6.1 (7) 节。Yes: use the
z
length modifier:The other length modifiers that are available are
hh
(forchar
),h
(forshort
),l
(forlong
),ll
(forlong long
),j
(forintmax_t
),t
(forptrdiff_t
), andL
(forlong double
). See §7.19.6.1 (7) of the C99 standard.是的,有。它是
%zu
(如 ANSI C99 中所指定)。请注意,
size_t
是无符号的,因此%ld
是双重错误:错误的长度修饰符和错误的格式转换说明符。如果您想知道,%zd
代表ssize_t
(已签名)。Yes, there is. It is
%zu
(as specified in ANSI C99).Note that
size_t
is unsigned, thus%ld
is double wrong: wrong length modifier and wrong format conversion specifier. In case you wonder,%zd
is forssize_t
(which is signed).MSDN 表示 Visual Studio 支持代码可移植的“I”前缀在 32 和 64 位平台上。
MSDN, says that Visual Studio supports the "I" prefix for code portable on 32 and 64 bit platforms.