【发布时间】:2013-05-27 09:44:18
【问题描述】:
我是 C 的新手,我遇到了:
#include <stdio.h>
#include <inttypes.h>
int main(void)
{
uint64_t foo = 10;
printf("foo is equal to %" PRIu64 "!\n", foo);
return 0;
}
而且它有效!我不明白为什么?有人可以帮我解决这个问题吗? 非常感谢! 托尔
【问题讨论】:
我是 C 的新手,我遇到了:
#include <stdio.h>
#include <inttypes.h>
int main(void)
{
uint64_t foo = 10;
printf("foo is equal to %" PRIu64 "!\n", foo);
return 0;
}
而且它有效!我不明白为什么?有人可以帮我解决这个问题吗? 非常感谢! 托尔
【问题讨论】:
PRIu64 是 C99 中引入的格式说明符,用于打印 uint64_t,其中 uint64_t 是(来自链接的参考页面):
无符号整数类型,宽度分别为 ... 64 位 (仅当实现直接支持该类型时才提供)
PRIu64 是一个字符串(字面量),例如:
printf("%s\n", PRIu64);
在我的机器上打印llu。从 C99 标准的 6.4.5 字符串文字 节中连接相邻的字符串文字:
在翻译阶段 6,由任何相邻字符序列和宽字符串文字标记指定的多字节字符序列连接成单个多字节字符序列。如果任何标记是宽字符串文字标记,则生成的多字节字符序列将被视为宽字符串文字;否则,将其视为字符串文字。
这意味着:
printf("foo is equal to %" PRIu64 "!\n", foo);
(在我的机器上)是一样的:
printf("foo is equal to %llu!\n", foo);
【讨论】:
PRIu64 是否扩展为"llu" 所做的选择。在某些实现中,它可能会扩展到"u",这意味着"%u" 将适合打印uint64_t 值。然而,这不应该被依赖。没有其他便携式方法可以打印您满意的uint64_t 值。
你也可以用它来打印指针值。来自LTP BPF patchset的示例:
static uint64_t *val;
...
tst_res(TFAIL, "dst(r7) = %"PRIu64", but should be zero", *val);
打印:dst(r7) = 18446744073709551615, but should be zero
注意:tst_res() 是一个类似 printf 的函数。
【讨论】: