嗯,你是谁PRIu64?

Posted

技术标签:

【中文标题】嗯,你是谁PRIu64?【英文标题】:Mmh, who are you PRIu64? 【发布时间】: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;

而且它有效!我不明白为什么?有人可以帮我解决这个问题吗? 非常感谢! 托尔

【问题讨论】:

【参考方案1】:

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);

见http://ideone.com/jFvKR9。

【讨论】:

@torr 取决于您的硬件、操作系统、编译器和库(统称为“实现”)对PRIu64 是否扩展为"llu" 所做的选择。在某些实现中,它可能会扩展到"u",这意味着"%u" 将适合打印uint64_t 值。然而,这不应该被依赖。没有其他便携式方法可以打印您满意的uint64_t 值。【参考方案2】:

你也可以用它来打印指针值。来自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 的函数。

【讨论】:

以上是关于嗯,你是谁PRIu64?的主要内容,如果未能解决你的问题,请参考以下文章

Bamboo + Stash:请告诉我你是谁

MindSpore:不用摘口罩也知道你是谁

场景编程集锦 - 你是谁?

场景编程集锦 - 你是谁?

Thrift-0.10.0 CenOS 7 编译错误 error: expected ')' before 'PRIu32'

2什么是建模和有哪些模型