_tmainне існує в C ++. mainробить.
_tmain є розширенням Microsoft.
mainє, відповідно до стандарту C ++, точкою входу програми. Він має один з цих двох підписів:
int main();
int main(int argc, char* argv[]);
Microsoft додала wmain, який замінює другий підпис цим:
int wmain(int argc, wchar_t* argv[]);
А потім, щоб полегшити перемикання між Unicode (UTF-16) та їх багатобайтовим набором символів, вони визначили, _tmainякий, якщо Unicode увімкнено, складається як wmain, а інакше як main.
Що стосується другої частини вашого питання, перша частина головоломки полягає в тому, що ваша основна функція неправильна. wmainслід брати wchar_tаргументи, а не char. Оскільки компілятор не застосовує цього до mainфункції, ви отримуєте програму, де масив wchar_tрядків передається mainфункції, яка інтерпретує їх як charрядки.
Тепер, в UTF-16, наборі символів, використовуваному Windows, коли Unicode увімкнено, всі символи ASCII представлені у вигляді пари байтів, \0а потім значення ASCII.
А оскільки процесор x86 є малопомітним, то порядок цих байтів змінюється тим, що спочатку стає значення ASCII, а потім - нульовий байт.
І в рядку char, як зазвичай закінчується рядок? Так, нульовим байтом. Таким чином, ваша програма бачить купу рядків, кожен байт довгий.
Загалом у програмування Windows є три варіанти:
- Явно використовуйте Unicode (зателефонуйте wmain, і для кожної функції Windows API, яка приймає аргументи, пов’язані
-Wзі знаком, викличте версію функції. Замість CreateWindow виклик CreateWindowW). І замість того, щоб використовувати charвикористання wchar_tтощо
- Явно відключити Unicode. Викличте основний та CreateWindowA та використовуйте
charдля рядків.
- Дозволити обидва. (зателефонуйте _tmain та CreateWindow, які визначають main / _tmain та CreateWindowA / CreateWindowW) та використовуйте TCHAR замість char / wchar_t.
Це ж стосується типів рядків, визначених windows.h: LPCTSTR вирішує або LPCSTR, або LPCWSTR, а для кожного іншого типу, що включає char або wchar_t, завжди існує версія -T-, яка може бути використана замість цього.
Зауважте, що все це стосується Microsoft. TCHAR - це не стандартний тип C ++, це макрос, визначений у windows.h. wmain та _tmain також визначаються лише Microsoft.