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).