This question already has answers here:
How do I use the wmain() entry point in Code::Blocks?
(2个答案)
2年前关闭。
我试图将
这是我的代码。
它给出了错误信息。
为什么会崩溃?我不知道为什么会出现此错误。
似乎不做任何事情的
免责声明:我只是写了这段代码。尚未经过广泛测试。
(2个答案)
2年前关闭。
我试图将
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;
}
它给出了错误信息。
为什么会崩溃?我不知道为什么会出现此错误。
最佳答案
wmain
是Visual C++语言扩展,用于在Windows中处理UTF-16编码的命令行参数。
但是,现代MinGW g++(正在使用的编译器)通过选项 -municode
支持该功能。
对于不支持它的编译器,您可以轻松地编写几行的标准main
来调用Windows的GetCommandLineW
和CommandLineToArgvW
,然后调用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
的调用完成了对本地变量的析构函数(如wmain
)的调用。免责声明:我只是写了这段代码。尚未经过广泛测试。
09-26 15:29