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

时间:2018-09-22 08:13:35

标签: c++ unicode mingw wmain

我试图使用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退出状态

为什么会崩溃?我不知道为什么会出现此错误。

1 个答案:

答案 0 :(得分:3)

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

但是,现代MinGW g ++(正在使用的编译器)通过选项 -municode 支持该功能。

对于不支持该编译器的编译器,您可以轻松地编写几行的标准main来调用Windows的GetCommandLineWCommandLineToArgvW,然后调用{{1} }功能。


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

wmain

#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

免责声明:我只是写了这段代码。尚未经过广泛测试。