C 嗯,你是谁?

C 嗯,你是谁?,c,macros,printf,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; } #包括 #包括 内部主(空) { uint64_t foo=10; printf(“foo等于%“PRIu64”!\n”,foo); 返回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;
}
#包括
#包括
内部主(空)
{
uint64_t foo=10;
printf(“foo等于%“PRIu64”!\n”,foo);
返回0;
}
而且它有效!我不明白为什么?谁能帮我一下吗? 谢谢! torr是C99中引入的一种格式说明符,用于打印
uint64\u t
,其中
uint64\u 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);

请参阅。

您也可以使用它打印指针值。示例来自:

打印:
dst(r7)=18446744073709551615,但应为零


注意:
tst_res()
是一个类似printf的函数。

@torr它取决于您的硬件、操作系统、编译器和库(统称为“实现”)所做的选择,
PRIu64
是否扩展为
“llu”
。在某些实现中,它可能会扩展到
“u”
,这意味着
“%u”
将适合打印
uint64\t
值。然而,这不应该被依赖。没有其他便携式方法可以打印您喜欢的
uint64\t
值。
static uint64_t *val;
...
tst_res(TFAIL, "dst(r7) = %"PRIu64", but should be zero", *val);