簡體   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