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,

Отказ от ответственности: я только что написал этот код. Это не было тщательно проверено.

Другие вопросы по тегам