繁体   English   中英

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

[英]How to print uint32_t variables value via wprintf function?

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

是否可行,实际上取决于编译器使用的C标准。

从此字符串文字参考

只能连接两个窄或两个宽字符串文字。 直到C99为止

如果一个文字没有前缀,则生成的字符串文字具有由前缀文字指定的宽度/编码。 如果两个字符串文字具有不同的编码前缀,则串联是实现定义的。 自C99以来

[强调我的]

因此,如果您使用的是旧的编译器或不支持C99标准(或更高版本)的编译器,则不可能。 除了固定宽度整数类型是在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>的宏的一种(较弱)替代方法是将固定宽度类型转换/转换为等效或更大的标准类型。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM