C++ wmain функция ошибка при использовании Unicode
Я пытался использовать 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 ответ
wmain
расширение языка Visual C++ для обработки аргументов командной строки в кодировке UTF-16 в Windows
Однако он поддерживается современным 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
,
Отказ от ответственности: я только что написал этот код. Это не было тщательно проверено.