在printf的格式字符串中使用%lu是否有效,其中PRIu32是预期的?

gaa*_*kam 2 c int format-specifiers

例如,假设我有一个i类型的变量uint32_t.打印它的预期方式是这样的:

printf("%"PRIu32"\n", i);
Run Code Online (Sandbox Code Playgroud)

但是,应该注意,要求long unsigned int至少32位宽.正确的说明符long unsigned int%lu.因此,上述陈述可以替换为:

printf("%lu\n", i);
Run Code Online (Sandbox Code Playgroud)

我想是的,因为我没有理由不这样做.但是,如果是,那么这将消除对PRIu32这些宏化说明符的存在的需要,所以我想我最好问一下.

我问它的原因是我想printf动态创建一个格式字符串,如果我不知道字符串的大小PRIu32扩展为(以及是否sizeof(PRIu32)是否有效可能值得一个单独的问题).

在任何情况下,我认为它应该是有效的写:

printf("%lu\n", (long unsigned)i);
Run Code Online (Sandbox Code Playgroud)

Joh*_*ger 7

因此,上述陈述可以替换为:

printf("%lu\n", i);
Run Code Online (Sandbox Code Playgroud)

我想是的,因为我没有理由不这样做.

不,因为long unsigned int可能大于 32位,或者如果恰好32位仍然可以具有不同的表示uint32_t.

在任何情况下,我认为它应该是有效的写:

printf("%lu\n", (long unsigned)i);
Run Code Online (Sandbox Code Playgroud)

是的,正如您所观察到的那样,它也是安全的,因为long unsigned int它需要能够代表uint32_t可以采用的所有值.