我试图使用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退出状态
为什么会崩溃?我不知道为什么会出现此错误。
答案 0 :(得分:3)
wmain
是Visual C ++语言扩展,用于在Windows中处理UTF-16编码的命令行参数。
但是,现代MinGW g ++(正在使用的编译器)通过选项 -municode
支持该功能。
对于不支持该编译器的编译器,您可以轻松地编写几行的标准main
来调用Windows的GetCommandLineW
和CommandLineToArgvW
,然后调用{{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
。
免责声明:我只是写了这段代码。尚未经过广泛测试。