MingW64 的 wprintf 行为

wprintf behaviour with MingW64

我一直在为一个非常奇怪的问题挠头。 请参阅下面的示例代码:

test_c.c

#include <wchar.h>
#include <stringapiset.h>
    
int  main (int argc,  char   **argv)
{
  const char mystr[] = "The brown fox jumped over the lazy dog";

  wchar_t wideName[MAX_PATH];
  int len = MultiByteToWideChar(CP_UTF8, 0, mystr, -1, wideName, MAX_PATH-1);

  wprintf( L"Length = %d - String = %s\n", len, wideName );

  return 0;      
}

编译命令非常简单:

gcc -static test_c.c -o test_c.exe

发生的第一件奇怪的事情是,我得到的结果因我使用的工具链而异:

  1. 使用 x86_64-6.3.0-release-posix-seh-rt_v5-rev2.7z, x86_64-7.3.0-release-posix-seh-rt_v5-rev0, or x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z(全部使用较旧的 Ming-W64 版本),我得到了预期的结果:

Length = 39 - String = The brown fox jumped over the lazy dog

  1. 使用 winlibs-x86_64-posix-seh-gcc-10.2.0-llvm-10.0.1-mingw-w64-8.0.0-r1 or winlibs-x86_64-posix-seh-gcc-11.2.0-llvm-12.0.1-mingw-w64-9.0.0-r1(使用 MingW-64 8.0.0 和 9.0.0)我得到这个:

Length = 39 - String = T

更奇怪的是,如果我现在把它变成一个 C++ 文件:

test_cpp.cpp

//#include <stdio.h>
#include <cwchar>
#include <stringapiset.h>

int  main (int argc,  char   **argv)
{
  const char mystr[] = "The brown fox jumped over the lazy dog";

  wchar_t wideName[MAX_PATH];
  int len = MultiByteToWideChar(CP_UTF8, 0, mystr, -1, wideName, MAX_PATH-1);

  wprintf( L"Length = %d - String = %s\n", len, wideName );

  return 0;      
}

如果我使用相同的编译命令:

g++ -static test_cpp.cpp -o test_cpp.exe

然后我得到了更奇怪的东西:

  1. 使用上面提到的所有工具链,我得到:

Length = 39 - String = T

  1. 但是,如果我取消对 #include 的注释,那么我会得到类似于普通旧 C 示例的内容(结果因工具链而异)

我做错了什么吗? 有办法解决这个问题吗?

谢谢!

Am I doing something wrong ? Is there a way to fix this ?

是的。 %s 用于打印 char*。要打印 wchar_t*,请使用 %ls.