_tmain
não existe em C ++. main
faz.
_tmain
é uma extensão da Microsoft.
main
é, de acordo com o padrão C ++, o ponto de entrada do programa. Ele possui uma dessas duas assinaturas:
int main();
int main(int argc, char* argv[]);
A Microsoft adicionou um wmain que substitui a segunda assinatura por esta:
int wmain(int argc, wchar_t* argv[]);
E, para facilitar a alternância entre o Unicode (UTF-16) e seu conjunto de caracteres multibyte, eles definiram _tmain
qual, se o Unicode estiver ativado, será compilado como wmain
e, caso contrário, como main
.
Quanto à segunda parte da sua pergunta, a primeira parte do quebra-cabeça é que sua função principal está errada. wmain
deve levar uma wchar_t
discussão, não char
. Como o compilador não impõe isso para a main
função, você obtém um programa no qual uma matriz de wchar_t
strings é passada para a main
função, que as interpreta como char
strings.
Agora, no UTF-16, o conjunto de caracteres usado pelo Windows quando o Unicode está ativado, todos os caracteres ASCII são representados como o par de bytes \0
seguido pelo valor ASCII.
E como a CPU x86 é little-endian, a ordem desses bytes é trocada, para que o valor ASCII seja o primeiro e, em seguida, seguido por um byte nulo.
E em uma string de caracteres, como a string geralmente é terminada? Sim, por um byte nulo. Portanto, seu programa vê várias seqüências de caracteres, cada uma com um byte de comprimento.
Em geral, você tem três opções ao executar a programação do Windows:
- Use explicitamente Unicode (chamada wmain e, para cada função da API do Windows que aceite argumentos relacionados a char, chame a
-W
versão da função. Em vez de CreateWindow, chame CreateWindowW). E em vez de usar char
use wchar_t
, e assim por diante
- Desabilite explicitamente o Unicode. Chame main e CreateWindowA e use
char
para strings.
- Permita ambos. (chame _tmain e CreateWindow, que resolve como main / _tmain e CreateWindowA / CreateWindowW) e use TCHAR em vez de char / wchar_t.
O mesmo se aplica aos tipos de sequência definidos por windows.h: LPCTSTR resolve LPCSTR ou LPCWSTR e para todos os outros tipos que incluem char ou wchar_t, sempre existe uma versão -T que pode ser usada.
Observe que tudo isso é específico da Microsoft. TCHAR não é um tipo C ++ padrão, é uma macro definida em windows.h. wmain e _tmain também são definidos apenas pela Microsoft.