_tmain
no existe en C ++. main
hace.
_tmain
es una extensión de Microsoft.
main
es, según el estándar C ++, el punto de entrada del programa. Tiene una de estas dos firmas:
int main();
int main(int argc, char* argv[]);
Microsoft ha agregado un wmain que reemplaza la segunda firma con esto:
int wmain(int argc, wchar_t* argv[]);
Y luego, para facilitar el cambio entre Unicode (UTF-16) y su conjunto de caracteres multibyte, han definido _tmain
qué, si Unicode está habilitado, se compila como wmain
, y de lo contrario como main
.
En cuanto a la segunda parte de su pregunta, la primera parte del rompecabezas es que su función principal es incorrecta. wmain
debería tomar una wchar_t
discusión, no char
. Como el compilador no aplica esto para la main
función, obtienes un programa en el que wchar_t
se pasan una serie de cadenas a la main
función, que las interpreta como char
cadenas.
Ahora, en UTF-16, el juego de caracteres utilizado por Windows cuando Unicode está habilitado, todos los caracteres ASCII se representan como el par de bytes \0
seguido del valor ASCII.
Y dado que la CPU x86 es little-endian, el orden de estos bytes se intercambia, de modo que el valor ASCII viene primero, luego seguido de un byte nulo.
Y en una cadena de caracteres, ¿cómo se termina generalmente la cadena? Sí, por un byte nulo. Por lo tanto, su programa ve un montón de cadenas, cada una de ellas en bytes.
En general, tiene tres opciones al hacer la programación de Windows:
- Utilice explícitamente Unicode (llame a wmain, y para cada función de API de Windows que tome argumentos relacionados con caracteres, llame a la
-W
versión de la función. En lugar de CreateWindow, llame a CreateWindowW). Y en lugar de usar el char
uso wchar_t
, etc.
- Desactiva explícitamente Unicode. Llame a main y CreateWindowA, y use
char
para cadenas.
- Permitir ambos. (llame a _tmain y CreateWindow, que resuelven a main / _tmain y CreateWindowA / CreateWindowW), y usan TCHAR en lugar de char / wchar_t.
Lo mismo se aplica a los tipos de cadena definidos por windows.h: LPCTSTR se resuelve en LPCSTR o LPCWSTR, y para cualquier otro tipo que incluya char o wchar_t, siempre existe una versión -T- que puede utilizarse en su lugar.
Tenga en cuenta que todo esto es específico de Microsoft. TCHAR no es un tipo estándar de C ++, es una macro definida en windows.h. wmain y _tmain también están definidos solo por Microsoft.