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