在C语言的printf中,未加引号的`PRIu32`是什么?

14

我正在查看以下代码:

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

int main()
{
    uint32_t total = 0;

    printf("\tTotal: %"PRIu32"\n\n", total);
    return total;
}
< p> PRIu32 如何适用于 printf 语法?我的意思是,我可以猜测 Iu32 可能意味着“无符号32位整数”。但是,我不确定 man 3 printf 中找到的哪种形式能够容纳引号外的变量--以及如何将其推广到引号外的其他语句。


如果您使用gcc,请尝试使用gcc prog.c -E -P。此外,像"\tTotal: %" "u" "\n\n"这样的字符串字面量序列在预编译处理中被合并。 - BLUEPIXY
@BLUEPIXY 运行 $ gcc progc -E -P test.c 时出现了 clang: error: no such file or directory: 'progc' 的错误提示。请问这个命令应该做什么? - Alex
请将“prog.c”替换为您要编译的C源代码。 - BLUEPIXY
@BLUEPIXY 哇,太酷了!我想将来会用到它,每当我不知道某个变量是什么时。顺便说一句,正是因为你的帖子缺少了“.”,所以我没有正确解释它。 - Alex
1个回答

22

这是一个格式宏常量

它们用于在不同平台上对值进行便携式格式化,因为原始数字类型的大小可能不同。

问题中的格式用于以十进制格式打印无符号32位整数。

这些宏之所以有效,是因为C将连续的常量字符串文字连接在一起。例如,三个字符串"\tTotal: %" "u" "\n\n"将由编译器连接成单个字符串"\tTotal: %u\n\n"


1
这不是问题中引号的数量。 - pm100
1
@pm100,别太苛刻了。他的评论已经足以回答我的问题了... - Alex
4
宏定义的作用是将它们扩展为字符串,例如 #define PRIu32 "u" - Some programmer dude
2
我并不是故意挑剔,我只是好奇它为什么能够工作。这个答案很好,但并没有解释在你的情况下发生了什么。 - pm100
1
@Someprogrammerdude 如果它被定义为字符串"u",我们是否需要使用+运算符将其连接到我们传递给printf的字符串中?或者C语言不需要使用+进行连接? - user1534664
1
@user1534664 你不能使用+来连接字符串。但是连续的字面量字符串会被编译器自动连接起来。正如答案中所提到的。 - Some programmer dude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接