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

时间:2016-04-29 13:47:00

标签: c++ c printf wchar-t uint32-t

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

4 个答案:

答案 0 :(得分:5)

如果这样做或不起作用,实际上取决于编译器使用的C标准。

来自this string literal reference

  

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

  

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

[强调我的]

因此,如果您使用旧的编译器或不支持C99标准(或更高版本)的编译器,那么它是不可能的。除了fixed-width integer types在C99中标准化,因此这些旧编译器的宏并不存在,这使问题没有实际意义。

对于支持C99及更高版本的更现代的编译器,它不是问题,因为字符串文字连接将起作用,编译器会将非前缀字符串转换为宽字符串,所以这样做< / p>

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);

答案 1 :(得分:3)

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

RSpec.configure do |config|
  .....
  .......
  config.include(Capybara::DSL)

end

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

正确编译并提供以下输出:

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

答案 2 :(得分:1)

即使你的编译器不支持连接不同前缀文字的连接,你总是可以扩大一个狭窄的文字:

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

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

Demo

答案 3 :(得分:1)

使用git log origin/dev..HEAD 中的宏的一种(较弱的)替代方法是将固定宽度类型转换/转换为等效或更大的标准类型。

<inttypes.h>