如何通过 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);
使用 <inttypes.h>
中的宏的(较弱)替代方法是 convert/cast 将固定宽度类型转换为等效或更大的标准类型。
wprintf(L"%lu\n", 0ul + some_uint32_t_value);
// or
wprintf(L"%lu\n", (unsigned long) some_uint32_t_value);
众所周知,要打印类型为固定宽度整数类型之一(如 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);
使用 <inttypes.h>
中的宏的(较弱)替代方法是 convert/cast 将固定宽度类型转换为等效或更大的标准类型。
wprintf(L"%lu\n", 0ul + some_uint32_t_value);
// or
wprintf(L"%lu\n", (unsigned long) some_uint32_t_value);