_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, и так далее
- Явно отключить Юникод. Вызовите main, 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.