gpt4 book ai didi

c - 如何在 Visual Studio 2013 中将 stdint 类型与 _tprintf 一起使用?

转载 作者:太空狗 更新时间:2023-10-29 15:31:48 24 4
gpt4 key购买 nike

举个例子:

char* fileName = "C:\\windows\\system32\\kernel32.dll";
uint32_t fileSize = 1163264;
printf("The size of %s is %"PRIu32"\n", fileName, fileSize);

一切都很好,现在如果我们想通过 tchar.h 支持透明的 unicode,代码将如下所示:

TCHAR* fileName = _T("C:\\windows\\system32\\kernel32.dll");
uint32_t fileSize = 1163264;
_tprintf(_T("The size of %s is %")_T(PRIu32)_T("\n"), fileName, fileSize);

如果 定义 unicode,此方法有效。但是,如果定义了 unicode,编译器将中止并出现以下错误:

error C2308: concatenating mismatched strings
Concatenating wide "The size of %s is %l" with narrow "u"

现在查看 Microsoft 的 inttypes.h 我看到:

...
#define _PFX_32 "l"
...
#define PRIu32 _PFX_32 "u"

这意味着上面例子中的 _T(PRIu32) 解析为:

_T("l" "u")

...当然不能工作并解释正确的编译器错误。

因此我的问题是,Microsoft 是如何想象我们将他们的 inttypes.h 定义与 _tprintf 一起使用的?

最佳答案

根据1当前的C标准,只有一个字符序列(读作:字符串)必须以编码前缀为前缀,其余的被视为具有相同的前缀,并连接成一个字符串。

编码前缀由_T宏决定。如果未定义 UNICODE,它将解析为空,否则它将在参数前加上 L

解决方案是在第一个字符串上使用 _T 宏,其余的不使用宏,它们将使用相同的编码:

_tprintf(_T("The size of %s is %") PRIu32 "\n", fileName, fileSize);

但是您使用的 Visual Studio 版本不兼容 C99,因此缺少此功能。这似乎已在 Visual Studio 2015 中修复。

标准中的示例2 中演示了相同的用法。


1(引自:ISO/IEC 9899:201x 6.4.5 String literals 5)
在翻译阶段 6,由任意序列指定的多字节字符序列相邻字符和相同前缀的字符串文字标记连接成一个单个多字节字符序列。如果任何标记具有编码前缀,则生成的多字节字符序列被视为具有相同的前缀;否则,它被视为字符串文字。是否为不同前缀的宽字符串字面量可以连接标记,如果可以,则处理生成的多字节字符序列是实现定义的。

2(引自:ISO/IEC 9899:201x 7.8.1 Macros for format specifiers 7)
wprintf(L"最大整数值为%020"PRIxMAX "\n", i);

关于c - 如何在 Visual Studio 2013 中将 stdint 类型与 _tprintf 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41126081/

24 4 0
文章推荐: android - 更改 ActionBar 背景的问题 - Android
文章推荐: javascript - ReactJS:如何让