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