如何将宽字符串文字与PRId32,PRIu64等连接起来?

Tim*_*003 8 c string unicode macros visual-c++

假设我需要int32_t使用printf格式说明符打印格式化的字符串<inttypes.h>.

int32_t i = 0;
printf("%" PRId32 "\n", i);
Run Code Online (Sandbox Code Playgroud)

如果我尝试在Visual C++ 2013中对宽字符执行相同操作,则会失败:

#define W_(val) L ## val
#define W(val) W_(val)
wprintf(L"%" W(PRId32) L"\n", i);
Run Code Online (Sandbox Code Playgroud)

错误C2308:连接不匹配的字符串

如何将宽字符串文字与格式转换说明符宏连接?

Jam*_*lis 6

问题是双重的.首先,正如rici的回答所指出的,C99和C++ 11都支持将窄字符串文字和宽字符串文字连接在一起,所以你不需要通过在L之前加宽来扩展窄文字.Visual C++还不支持这个C或C++的功能.

因为编译器还不支持此功能,所以我们应该在库中使您可以使用类似答案的技术显式扩展这些字符串文字.不幸的是,我们已经定义了这些宏,以便它们可以扩展为多个字符串文字.例如,PRId32扩展为"l" "d".

这是有效的,但它确实阻止你扩大,因为没有办法L在第二个字符串文字前加上("d"进入L"d").如果没有(重新)自己定义宏,我恐怕没有办法让这项工作成功.

我在内部打开了一个bug,这样如果编译器在下一个版本的预处理期间没有添加对混合宽度文字串联的支持,我们可以重新访问这些定义,以便可以明确地扩展它们.

  • 我们已经更新了Visual C ++库的下一个主要版本的宏,因此它将与下一个版本一起使用。 (2认同)