_tmainno existe en C ++. mainhace.
_tmain es una extensión de Microsoft.
maines, 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 _tmainqué, 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. wmaindebería tomar una wchar_tdiscusión, no char. Como el compilador no aplica esto para la mainfunción, obtienes un programa en el que wchar_tse pasan una serie de cadenas a la mainfunción, que las interpreta como charcadenas.
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 \0seguido 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
-Wversión de la función. En lugar de CreateWindow, llame a CreateWindowW). Y en lugar de usar el charuso wchar_t, etc.
- Desactiva explícitamente Unicode. Llame a main y CreateWindowA, y use
charpara 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.