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

Is it valid to use %lu in a format string for printf where PRIu32 would be expected?

假设我有一个类型为 uint32_t 的变量 i。预期的打印方式如下:

printf("%"PRIu32"\n", i);

不过需要注意的是,long unsigned int要求至少32位宽。 long unsigned int 的正确说明符是 %lu。因此,上面的语句是否可以替换为:

printf("%lu\n", i);

我想是的,因为我看不出为什么不这样做。但是,如果是,那么这将消除这些宏化说明符(如 PRIu32)存在的需要,所以我想我最好问一下。

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

无论如何,我想这样写应该是有效的:

printf("%lu\n", (long unsigned)i);

Thus, can the above statement be replaced with:

printf("%lu\n", i);

I’d suppose yes, since I can see no reason why not.

不,因为 long unsigned int 可以 比 32 位大 ,或者如果恰好 32 位可以有与 uint32_t 不同的表示。

In any case, I suppose it should be valid to write:

printf("%lu\n", (long unsigned)i);

是的,正如您观察到的,它也是 安全的,因为需要 long unsigned int 才能表示 uint32_t 的所有值可以带。