【问题标题】:How to print uint32_t variables value via wprintf function?如何通过 wprintf 函数打印 uint32_t 变量值?
【发布时间】:2016-04-29 13:46:59
【问题描述】:

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

【问题讨论】:

  • 您使用 C 和 C++ 中的哪一个进行编程?请最多选择一项。
  • @FUZxxl 为什么我只能选择一个?
  • 真正的问题是什么?你的代码不能编译吗? wprintf 显示的内容是否超出您的预期?
  • 因为通常答案是不同的,但在这种情况下可能不是。此外,使用printf()c++ 程序中并不常见,使用<iostream> 即可解决所有这些问题。
  • @iharob 我认为在这种情况下没有区别。是的,在 C++ 中使用 printf 并不常见,但在某些情况下它可能很有用。

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


【解决方案1】:

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

来自this string literal reference

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

如果一个文字没有前缀,则生成的字符串文字具有前缀文字指定的宽度/编码。如果两个字符串文字具有不同的编码前缀,则连接是实现定义的。 (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);

【讨论】:

  • 感谢您的回答。你是对的,我使用的是旧的编译器,这是一个问题。
  • 对于符合 C89 的编译器是否有任何解决方法?
  • @Constructor 应该可以使用一些类似函数的宏。更新了我的答案。
  • @Constructor :#undef PRIu32 然后#define PRIu32 L"u"。然后wprintf(L"Value = %" PRIu32 "\n", uint32_t_value); 应该适用于旧的编译器,至少适用于我的旧 Visual Studio 6。
  • @MichaelWalz 你知道像PRIu32 这样的宏的用途吗?
【解决方案2】:

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

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

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

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

AA 123 BB

【讨论】:

  • 由一个编译器编译的代码不一定符合标准。
  • @Constructor 我从来没有这么说。
【解决方案3】:

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

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

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

Demo

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-11
      相关资源
      最近更新 更多