作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我需要打印一个带有 int32_t
的格式化字符串使用 <inttypes.h>
中的 printf 格式说明符.
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);
error C2308: concatenating mismatched strings
如何将宽字符串文字与格式转换说明符宏连接起来?
最佳答案
问题是双重的。首先,如 rici 的回答所述,C99 和 C++11 都添加了对将窄字符串文字和宽字符串文字连接在一起的支持,因此您不需要通过在 L 前面加上 L 来加宽窄文字。Visual C++ 尚不支持此功能C 或 C++ 的功能。
因为编译器尚不支持此功能,我们应该在库中使您能够使用类似于您的答案中的技术显式加宽这些字符串文字。不幸的是,我们定义这些宏的方式使得它们可以扩展为多个字符串文字。例如,PRId32
扩展为 "l""d"
。
这是有效的,但它确实会阻止你扩大,因为没有办法将 L
添加到第二个字符串文字(使 "d"
成为L“d”
)。恐怕如果不自己(重新)定义宏,我看不出有什么方法可以完成这项工作。
我在内部发现了一个错误,这样如果编译器在下一版本的预处理期间不添加对混合宽度文字串联的支持,我们可以重新访问这些定义,以便有可能显式地扩大它们。
关于c - 如何将宽字符串文字与 PRId32、PRIu64 等连接起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21788652/
我是一名优秀的程序员,十分优秀!