[英]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.