_tmain
n'existe pas en C++. main
.
_tmain
est une extension Microsoft.
main
, selon la norme C++, le programme du point d'entrée.
Il a une de ces deux signatures:
int main();
int main(int argc, char* argv[]);
Microsoft a ajouté un wmain qui remplace la deuxième signature avec ceci:
int wmain(int argc, wchar_t* argv[]);
Et puis, pour le rendre plus facile de basculer entre Unicode (UTF-16) et de leurs caractères multioctets, ils ont défini _tmain
qui, si Unicode est activé, est compilé en tant que wmain
, et sinon, main
.
Comme pour la deuxième partie de votre question, la première partie de l'énigme est que votre principale fonction est mal. wmain
devrait prendre un wchar_t
argument, et non char
. Puisque le compilateur ne pas appliquer ce pour l' main
fonction, vous obtenez un programme où un tableau de wchar_t
chaînes sont passés à l' main
de la fonction, qui les interprète comme char
des chaînes de caractères.
Maintenant, en UTF-16, le jeu de caractères utilisé par Windows lors de l'Unicode est activée, tous les caractères ASCII sont représentés comme la paire d'octets \0
, suivie par la valeur ASCII.
Et depuis le CPU x86 est little-endian, l'ordre de ces octets sont inversés, de sorte que la valeur ASCII vient d'abord, puis suivi par un octet nul.
Et dans une chaine de caractères, quelle est la chaîne de caractères généralement fin? Yep, par un octet nul. Si votre programme voit un bouquet de chaînes de caractères, chacun des octets de long.
En général, vous disposez de trois options lorsque vous faites de la programmation sous Windows:
- Explicitement l'utilisation de l'Unicode (appel wmain, et pour chaque fonction API Windows qui prend en char-les arguments d'appel de l'
-W
version de la fonction. Au lieu de CreateWindow, appel CreateWindowW). Et au lieu d'utiliser char
utilisation wchar_t
, et ainsi de suite
- Désactiver explicitement Unicode. Appel principal, et CreateWindowA, et utiliser
char
pour les chaînes.
- Permettre à la fois. (appel _tmain, et CreateWindow, résoudre à main/_tmain et CreateWindowA/CreateWindowW), et l'utilisation TCHAR au lieu de char/wchar_t.
La même chose s'applique à la chaîne de types définis par windows.h:
LPCTSTR résout soit LPCSTR ou LPCWSTR, et pour chaque autre type qui comprend char ou wchar_t, a-T - version existe toujours, qui peut être utilisé à la place.
Il faut noter que tout ce qui est Microsoft. TCHAR n'est pas un standard du C++, c'est une macro définie dans windows.h. wmain et _tmain sont également définis par Microsoft.