如何通过 wprintf 函数打印 uint32_t 变量值?

How to print uint32_t variables value via wprintf function?

众所周知,要打印类型为固定宽度整数类型之一(如 uint32_t)的变量值,您需要包含 cinttypes(在 C++ 中)或 inttypes.h(在 C 中)头文件并使用格式说明符宏,如 PRIu32。但是当使用 wprintf 函数时如何做同样的事情呢?在这种情况下,此类宏应扩展为带有 L 前缀的字符串文字。

这是否有效取决于编译器使用的 C 标准。

来自this string literal reference

Only two narrow or two wide string literals may be concatenated. (until C99)

If one literal is unprefixed, the resulting string literal has the width/encoding specified by the prefixed literal. If the two string literals have different encoding prefixes, concatenation is implementation-defined. (since C99)

[强调我的]

因此,如果您使用的是旧编译器或不支持 C99 标准(或更高版本)的编译器,则不可能。此外 fixed-width integer types 在 C99 中被标准化,所以对于这样的旧编译器来说宏并不真正存在,使得这个问题没有实际意义。

对于支持 C99 及更高版本的更现代的编译器,这不是问题,因为字符串文字连接将起作用,并且编译器会将无前缀的字符串转换为宽字符字符串,例如

wprintf(L"Value = %" PRIu32 "\n", uint32_t_value);

会很好。


如果您有一个 C99 之前的编译器,但仍然有宏和固定宽度的整数类型,您可以使用类似函数的宏来为字符串文字添加 L 前缀。像

#define LL(s) L ## s
#define L(s) LL(s)

...

wprintf(L"Value = %" L(PRIu32) L"\n", uint32_t_value);

不确定问题出在哪里,但这里 (VS 2015) 都

wprintf(L"AA %" PRIu32 L" BB", 123);

printf("AA %" PRIu32 " BB", 123);

正确编译并给出以下输出:

AA 123 BB

即使您的编译器不支持不同前缀文字的串联,您也可以随时加宽一个窄文字:

#define WIDE(X) WIDE2(X)
#define WIDE2(X) L##X

wprintf(L"%" WIDE(PRIu32), foo);

Demo

使用 <inttypes.h> 中的宏的(较弱)替代方法是 convert/cast 将固定宽度类型转换为等效或更大的标准类型。

wprintf(L"%lu\n", 0ul + some_uint32_t_value);
// or 
wprintf(L"%lu\n", (unsigned long) some_uint32_t_value);