_tmainnão existe em C ++. mainfaz.
_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 _tmainqual, se o Unicode estiver ativado, será compilado como wmaine, 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. wmaindeve levar uma wchar_tdiscussão, não char. Como o compilador não impõe isso para a mainfunção, você obtém um programa no qual uma matriz de wchar_tstrings é passada para a mainfunção, que as interpreta como charstrings.
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 \0seguido 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
-Wversão da função. Em vez de CreateWindow, chame CreateWindowW). E em vez de usar charuse wchar_t, e assim por diante
- Desabilite explicitamente o Unicode. Chame main e CreateWindowA e use
charpara 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.