[msys2][gcc] 使用 MSys2 的 gcc 10.2 编译 wprintf() 的错误输出

问题描述

我需要使用 MSys2 的 gcc 工具链让这个精简的 C 程序在 Windows 7 上运行:

#include <stdio.h>

void wmain(int argc,wchar_t *argv[])
{
   for (int i = 1; i < argc; i++)
      wprintf(L"%s\n",argv[i]);
}

代码编译为

gcc -Wall -municode -O2 -march=x86-64 -m64 test.c

但给了我以下输出

>> ./a.exe kk лл
k   (!)
:?:?

我有以下问题:

  1. 我做错了什么?
  2. 我如何将编译器降级为 版本,比如说 9.x 还是 10.1? (我的印象是非常 大约一年前编译的同一个程序曾经可以正常工作)

编辑 [1]:同时我设法使用 gcc 9.3 设置了一个新的 MSys2 环境。 “错误”仍然存在,所以它不是编译器。

编辑 [2]:“一些程序员老兄”(cmp。下面)描述了“即时”解决方案(THX!)。

解决方法

即使对于宽字符 wprintf,格式 %s 也适用于 字符串。

您需要使用 %ls 来打印宽字符串:

 wprintf(L"%ls\n",argv[i]);

然而,这可能仍然不够,因为输入(包括参数)的实际编码可能不是预期的。您需要考虑程序运行所在终端使用的编码。