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