C++ wmain 函数错误时使用 Unicode

C++ wmain function error when using Unicode

本文关键字:Unicode 错误 wmain 函数 C++      更新时间:2023-10-16

我试图使用wmain进行简单的测试代码来练习WCS字符串(不是MBCS(,但我总是遇到错误,但找不到原因。

这是我的代码。

#include <iostream>
#include <stdio.h>
using namespace std;
int wmain(int argc, wchar_t * argv[])
{
for (int i = 1; i < argc; i++) {
fputws(argv[i], stdout);
fputws(L"n", stdout);
}
return 0;
}

它给出了错误消息。

c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libmingw32.a(main.o(:(.text.startup+0xa0(:对"WinMain@16"的未定义引用 collect2.exe:错误:ld 返回 1 个退出状态

为什么会崩溃?我无法找出为什么会出现此错误。

wmain是一种视觉C++语言扩展,用于处理 Windows 中的 UTF-16 编码命令行参数。

但是,现代 MinGW g++ 支持它,您正在使用的编译器,通过选项-municode

对于不支持它的编译器,您可以轻松地编写几行标准main,调用Windows的GetCommandLineWCommandLineToArgvW,然后调用wmain函数。


调用wmain的标准main示例,如上所示:

#ifdef USE_STD_MAIN
#include <stdlib.h>         // EXIT_...
#include <windows.h>        // GetCommandLineW, CommandLineToArgvW
#include <memory>           // std::(unique_ptr)
auto main()
-> int
{
int n_args;
wchar_t** p_args = CommandLineToArgvW(GetCommandLineW(), &n_args );
if( p_args == nullptr )
{
return EXIT_FAILURE;
}
const auto cleanup = []( wchar_t** p ) { LocalFree( p ); };
try
{
std::unique_ptr<wchar_t*, void(*)(wchar_t**)> u( p_args, cleanup );
return wmain( n_args, p_args );
}
catch( ... )
{
throw;
}
}
#endif

try的目的 -catch似乎什么都不做,是保证像这里u这样的局部变量析构函数的调用是为了调用wmain

免责声明:我刚刚写了那段代码。它没有经过广泛的测试。