winegcc编译时swprintf未格式化仅复制字面量格式串的原因是什么?
swprintf占位符不生效问题原因与解决方法
核心原因
该问题是Windows与类Unix平台对swprintf的格式化占位符规范不兼容导致的,具体差异如下:
- 微软Windows的C运行时(CRT)规定:
swprintf中的%s占位符默认匹配窄字符字符串(char*类型),宽字符串(wchar_t*类型)需要用%ls占位符匹配 - 类Unix平台(比如你使用的Ubuntu)的glibc标准库规定:
swprintf中的%s占位符默认匹配宽字符串(wchar_t*类型),窄字符串才需要用%ls匹配
你使用winegcc做交叉编译时,编译阶段调用的是Ubuntu侧的头文件与语法检查逻辑,会默认认可你代码中%s匹配宽字符串的写法;但最终生成的是Windows平台程序,运行时实际调用的是Windows CRT的swprintf实现,Windows侧无法识别%s匹配宽字符串的规则,就会导致占位符解析失败,直接输出原字面量内容。
修复方案
将占位符修改为双平台通用的%ls即可:
swprintf(cell, 100, L"Hello %ls", L"world");
%ls在Windows和类Unix的swprintf实现中,都统一表示匹配宽字符串,交叉编译场景下也可以正常完成占位符替换。
内容的提问来源于stack exchange,提问作者julienfr112
相关产品推荐
相关产品推荐

