假设我需要打印一个格式化的字符串int32_t
使用 printf 格式说明符<inttypes.h>
.
int32_t i = 0;
printf("%" PRId32 "\n", i);
如果我尝试在 Visual C++ 2013 中对宽字符执行相同的操作,则会失败:
#define W_(val) L ## val
#define W(val) W_(val)
wprintf(L"%" W(PRId32) L"\n", i);
错误 C2308:连接不匹配的字符串
如何将宽字符串文字与格式转换说明符宏连接起来?
问题是双重的。首先,正如 rici 的回答中所述,C99 和 C++11 都添加了对将窄字符串文字和宽字符串文字连接在一起的支持,因此您不需要通过在前面添加 L 来加宽窄文字。Visual C++ 尚不支持此功能C 或 C++ 的功能。
由于编译器尚不支持此功能,因此我们应该在库中使您能够使用答案中的技术显式地扩展这些字符串文字。不幸的是,我们定义这些宏的方式使得它们可以扩展为多个字符串文字。例如。,PRId32
扩展到"l" "d"
.
这是有效的,但它确实会阻止您扩大范围,因为没有办法在前面添加一个L
到第二个字符串文字(使"d"
into L"d"
)。恐怕我没有找到一种方法可以在不自己(重新)定义宏的情况下完成这项工作。
我在内部打开了一个错误,以便如果编译器在下一版本的预处理期间没有添加对混合宽度文字连接的支持,我们可以重新访问这些定义,以便可以显式地扩展它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)