_tmainn'existe pas en C ++. mainEst-ce que.
_tmain est une extension Microsoft.
mainest, selon la norme C ++, le point d'entrée du programme. Il possède l'une de ces deux signatures:
int main();
int main(int argc, char* argv[]);
Microsoft a ajouté un wmain qui remplace la deuxième signature par ceci:
int wmain(int argc, wchar_t* argv[]);
Et puis, pour faciliter le basculement entre Unicode (UTF-16) et leur jeu de caractères multi-octets, ils ont défini _tmainlequel, si Unicode est activé, est compilé en tant que wmain, et sinon en tant que main.
Quant à la deuxième partie de votre question, la première partie du puzzle est que votre fonction principale est incorrecte. wmaindevrait prendre un wchar_targument, non char. Comme le compilateur n'applique pas cela pour la mainfonction, vous obtenez un programme où un tableau de wchar_tchaînes est passé à la mainfonction, qui les interprète comme des charchaînes.
Maintenant, en UTF-16, le jeu de caractères utilisé par Windows lorsque Unicode est activé, tous les caractères ASCII sont représentés comme la paire d'octets \0suivie de la valeur ASCII.
Et comme le processeur x86 est peu endian, l'ordre de ces octets est inversé, de sorte que la valeur ASCII vient en premier, puis est suivie d'un octet nul.
Et dans une chaîne de caractères, comment la chaîne se termine-t-elle généralement? Oui, par un octet nul. Votre programme voit donc un tas de chaînes, chacune d'un octet de long.
En général, vous avez trois options lors de la programmation Windows:
- Utilisez explicitement Unicode (appelez wmain, et pour chaque fonction API Windows qui prend des arguments liés aux caractères, appelez la
-Wversion de la fonction. Au lieu de CreateWindow, appelez CreateWindowW). Et au lieu d'utiliser l' charutilisation wchar_t, etc.
- Désactivez explicitement Unicode. Appelez main et CreateWindowA et utilisez
charpour les chaînes.
- Autorisez les deux. (appelez _tmain et CreateWindow, qui se résolvent en main / _tmain et CreateWindowA / CreateWindowW), et utilisez TCHAR au lieu de char / wchar_t.
La même chose s'applique aux types de chaîne définis par windows.h: LPCTSTR se résout en LPCSTR ou LPCWSTR, et pour tout autre type qui inclut char ou wchar_t, une version -T- existe toujours qui peut être utilisée à la place.
Notez que tout cela est spécifique à Microsoft. TCHAR n'est pas un type C ++ standard, c'est une macro définie dans windows.h. wmain et _tmain sont également définis par Microsoft uniquement.