getwchar() и символ новой строки в MSVC и MinGW-w64

Обнаружилось, что следующий код

#ifndef UNICODE
    #define UNICODE
#endif

#ifndef _UNICODE
    #define _UNICODE
#endif

#include <stdio.h>      // stdin, wprintf(), getwchar()
#include <fcntl.h>      // _O_U16TEXT
#include <io.h>         // _setmode()
#include <windows.h>    // WCHAR

int wmain()
{
    // Setting Unicode mode
    
    _setmode(_fileno(stdin),  _O_U16TEXT);
    _setmode(_fileno(stdout), _O_U16TEXT);
    _setmode(_fileno(stderr), _O_U16TEXT);
    
    while(1)
    {
        WCHAR symbol = getwchar();
        wprintf(L"0x%.4X\n", symbol);
    }
    
    return 0;
}

по-разному работает при компиляции в MSVC и MinGW-w64. Если запустить программу и просто нажать Enter, в случае MSVC код сработает, как и ожидается – напечатает 0x000A один раз. В случае же MinGW-w64 эта строка напечатается дважды, то есть на stdin подаются два символа новой строки.

Собственно, вопрос – с чем подобное может быть связано и как добиться одинакового поведения при компиляции разными средствами?

Информация о версии MinGW-w64: gcc version 8.1.0 (x86_64-win32-seh-rev0, Built by MinGW-W64 project)

Примечание: если попробуете самостоятельно скомпилировать код с помощью MinGW-w64, не забудьте флаг -municode.

UPD: В MinGW поведение такое же (если заменить wmain() на main() и _O_U16TEXT на 0x00020000).


Ответы (0 шт):