嗯,你是谁PRIu64?

tor*_*orr 54 c macros printf

我是C的新手,我遇到了:

#include <stdio.h>
#include <inttypes.h>

int main(void)
{
    uint64_t foo = 10;
    printf("foo is equal to %" PRIu64 "!\n", foo);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它的工作原理!我不明白为什么?有人可以帮我这个吗?非常感谢!托

hmj*_*mjd 68

PRIu64是一个格式说明符,在C99中引入,用于打印uint64_t,其中uint64_t(来自链接的参考页面):

无符号整数类型,宽度分别为... 64位(仅当实现直接支持该类型时提供)

PRIu64 是一个字符串(文字),例如以下内容:

printf("%s\n", PRIu64);
Run Code Online (Sandbox Code Playgroud)

llu在我的机器上打印.从6.4.5节C99标准的字符串文字中连接相邻的字符串文字:

在转换阶段6中,由任何相邻字符序列和宽字符串文字标记指定的多字节字符序列被连接成单个多字节字符序列.如果任何标记是宽字符串文字标记,则生成的多字节字符序列将被视为宽字符串文字; 否则,它被视为字符串文字.

这意味着:

printf("foo is equal to %" PRIu64 "!\n", foo);
Run Code Online (Sandbox Code Playgroud)

(在我的机器上)与以下相同:

printf("foo is equal to %llu!\n", foo);
Run Code Online (Sandbox Code Playgroud)

请参见http://ideone.com/jFvKR9.

  • @torr这取决于你的硬件,操作系统,编译器和库(统称为"实现")所做的选择,以确定`PRIu64`是否扩展为"llu".在某些实现中,它可能扩展为"u",相反,意味着"%u"将适合于打印`uint64_t`值.但是,这不应该依赖.没有其他的*便携式*方法来打印你会满意的`uint64_t`值. (5认同)