c 中与平台无关的 size_t 格式说明符?

发布于 2024-08-18 22:44:00 字数 521 浏览 8 评论 0原文

我想在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

不忘初心 2024-08-25 22:44:00

是:使用 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(对于),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:

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

The other length modifiers that are available are hh (for char), h (for short), l (for long), ll (for long long), j (for intmax_t), t (for ptrdiff_t), and L (for long double). See §7.19.6.1 (7) of the C99 standard.

流心雨 2024-08-25 22:44:00

是的,有。它是 %zu(如 ANSI C99 中所指定)。

size_t size = 1;
printf("the size is %zu", size);

请注意,size_t 是无符号的,因此 %ld 是双重错误:错误的长度修饰符和错误的格式转换说明符。如果您想知道,%zd 代表 ssize_t(已签名)。

Yes, there is. It is %zu (as specified in ANSI C99).

size_t size = 1;
printf("the size is %zu", size);

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 for ssize_t (which is signed).

乙白 2024-08-25 22:44:00

MSDN 表示 Visual Studio 支持代码可移植的“I”前缀在 32 和 64 位平台上。

size_t size = 10;
printf("size is %Iu", size);

MSDN, says that Visual Studio supports the "I" prefix for code portable on 32 and 64 bit platforms.

size_t size = 10;
printf("size is %Iu", size);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文