_tmain
n'existe pas en C ++. main
Est-ce que.
_tmain
est une extension Microsoft.
main
est, 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 _tmain
lequel, 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. wmain
devrait prendre un wchar_t
argument, non char
. Comme le compilateur n'applique pas cela pour la main
fonction, vous obtenez un programme où un tableau de wchar_t
chaînes est passé à la main
fonction, qui les interprète comme des char
chaî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 \0
suivie 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
-W
version de la fonction. Au lieu de CreateWindow, appelez CreateWindowW). Et au lieu d'utiliser l' char
utilisation wchar_t
, etc.
- Désactivez explicitement Unicode. Appelez main et CreateWindowA et utilisez
char
pour 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.