MingW64不同版本下wprintf输出宽字符串异常问题咨询
问题根因
该现象本质是MinGW不同版本、C/C++编译模式下,链接的C标准库wprintf实现的格式符语义不统一导致的:
- 微软原生MSVCRT的
wprintf规则:%s匹配窄字符(char*)参数,%ls/%S匹配宽字符(wchar_t*)参数 - MinGW自带的POSIX兼容C标准库的
wprintf遵循ISO C标准规则:%s匹配宽字符(wchar_t*)参数,%hs匹配窄字符(char*)参数 - 旧版MinGW默认优先链接系统MSVCRT的实现,新版MinGW默认改用自带的POSIX兼容实现,因此出现工具链版本差异
- C++模式下
cwchar头默认优先调用MinGW自带的标准库实现,因此所有版本工具链都会触发宽字符串截断问题:宽字符串的第二个字节是0x00,被当做窄字符串的结束符,所以只输出第一个字符T;取消stdio.h的注释后会切换为MSVCRT实现,因此表现和C版本一致。
解决方案
以下任意一种方案都可以解决该问题:
- 最优兼容方案:统一使用跨实现通用的格式符,输出宽字符串固定用
%ls,将打印语句修改为:
该写法对MSVCRT和MinGW自带标准库都兼容,可在所有版本工具链正常输出。wprintf( L"Length = %d - String = %ls\n", len, wideName ); - 强制使用MSVCRT实现:编译时添加参数
-D__USE_MINGW_ANSI_STDIO=0,关闭MinGW自带的ANSI标准IO实现,完全使用微软CRT逻辑。 - Windows专属方案:如果仅面向Windows平台开发,可直接使用微软
wprintf专属的宽字符串格式符%S,也可兼容所有MinGW版本。
内容的提问来源于stack exchange,提问作者DaveC
相关产品推荐
相关产品推荐

