Quelle est la différence entre _tmain() et() en C++?
Si je lance mon application C++ avec la suite de méthode main (), tout est OK:
int main(int argc, char *argv[])
{
cout << "There are " << argc << " arguments:" << endl;
//Loop through each argument and print its number and value
for (int i=0; i<argc; i++)
cout << i << " " << argv[i] << endl;
return 0;
}
- Je obtenir ce que je pense et mes arguments sont imprimés.
Cependant, si j'utilise _tmain:
int _tmain(int argc, char *argv[])
{
cout << "There are " << argc << " arguments:" << endl;
//Loop through each argument and print its number and value
for (int i=0; i<argc; i++)
cout << i << " " << argv[i] << endl;
return 0;
}
Il affiche uniquement le premier caractère de chaque argument.
Quelle est la différence la cause?
Vous devez vous connecter pour publier un commentaire.
_tmain
n'existe pas en C++.main
n'._tmain
est une extension Microsoft.main
est, selon la norme C++, le programme du point d'entrée.Il a une de ces deux signatures:
Microsoft a ajouté un wmain qui remplace la deuxième signature avec ceci:
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é commewmain
, et dans le cas contrairemain
.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 unwchar_t
argument, paschar
. Puisque le compilateur ne pas appliquer ce pour lamain
fonction, vous obtenez un programme où un tableau dewchar_t
les chaînes de caractères sont transmis à lamain
fonction, qui les interprète commechar
chaînes.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:
-W
version de la fonction. Au lieu de CreateWindow, appel CreateWindowW). Et au lieu d'utiliserchar
utilisationwchar_t
, et ainsi de suitechar
pour les chaînes.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.
Noter que tout cela est Microsoft. TCHAR n'est pas un standard C++ type, c'est une macro définie dans windows.h. wmain et _tmain sont également définis par Microsoft uniquement.
UNICODE
. Et certains autres ajustements pour C++, etc., avant, y compris<windows.h>
. Ensuite, utilisez les fonctions Unicode commeCreateWindow
(en général sansW
nécessaires à la fin)._tmain
est spécifique de Windows (et le système d'exploitation de l'API Windows est défini par Microsoft). Sur Linux ou MacOSX ou les systèmes FreeBSD n'est pas_tmain
point d'entrée!_tmain resolves to main/wmain
pasmain/_tmain
_tmain est une macro qui obtient redéfini en fonction de si oui ou non vous compilez avec Unicode ou ASCII. C'est une extension Microsoft et n'est pas garanti de fonctionner sur n'importe quel autres compilateurs.
La déclaration correcte est
Si la macro UNICODE est définie, qui s'étend à
Sinon, il se développe pour
Votre définition va pour un peu de chaque, et (si vous avez UNICODE définie) s'étend à
qui est tout simplement faux.
std::cout travaille avec des caractères ASCII. Vous avez besoin de std::wcout si vous utilisez des caractères larges.
essayer quelque chose comme cela
Ou vous pouvez simplement décider à l'avance si l'utilisation ou à l'échelle de caractères étroits. 🙂
Mis À Jour Le 12 Novembre 2013:
Changé le traditionnel "TCHAR" à "_TCHAR" qui semble être la dernière mode. Les deux fonctionnent très bien.
Mise À Jour De Fin
_tmain
utiliseTCHAR
paschar
._TCHAR
pasTCHAR
. Il vous manque le_
ici..:) Merci de modifier..que je ne vais pas être en mesure de modifier ce problème mineur.._TCHAR
..TCHAR
et_TCHAR
ont toujours existé.TCHAR
contrôle le jeu de caractères utilisé par Windows fichiers d'en-tête._TCHAR
contrôle le jeu de caractères utilisé par le CRT. La différence est subtile, mais bien justifié. Depuis le point d'entrée est la partie de la CRT, en utilisant_TCHAR
est correct, qu'. Pour référence, voir TEXTE vs _TEXT vs _T, et UNICODE vs _UNICODE.TCHAR
/_TCHAR
paire de symboles. Des erreurs dans votre réponse proposée: Alors qu'il est possible de compiler pour ASCII, ce n'est pas directement accessible par le biais de l'IDE de Visual Studio. De même,std::cout
n'est pas seulement un soutien ASCII.la _T convention est utilisée pour indiquer que le programme doit utiliser le jeu de caractères défini pour l'application (Unicode, ASCII, MBCS, etc.). Vous pouvez entourer votre cordes avec _T( ) pour les avoir stockées dans le format correct.
char
s avant. Si votre application utilise directementwchar_t
, alors votre demande est unicode.Ok, la question semble avoir été entendu assez bien, l'UNICODE surcharge de prendre un large tableau de caractères comme second paramètre. Donc, si le paramètre de ligne de commande est
"Hello"
qui serait probablement jusqu'à la fin comme"H\0e\0l\0l\0o\0\0\0"
et votre programme d'imprimer uniquement la'H'
avant qu'il voit ce qu'il pense est un terminateur null.Alors maintenant, vous demandez peut-être pourquoi il même compile et des liens.
Eh bien, il compile parce que vous êtes autorisé à définir une surcharge d'une fonction.
La liaison est un peu plus complexe. En C, il n'est pas décoré symbole de l'information jusqu'à ce qu'il trouve une fonction appelée main. L'argc et argv sont probablement toujours là, comme la pile des appels paramètres, juste au cas où, même si votre fonction est définie avec la signature, même si votre fonction arrive à les ignorer.
Même si le C++ n'ont décoré des symboles, il est presque certainement utilise C-lien de main, plutôt que d'un savant éditeur de liens qui ressemble, pour chacun, à tour de rôle. Donc, il a trouvé votre wmain et de mettre les paramètres dans la pile des appels dans le cas où il est le
int wmain(int, wchar_t*[])
version.Avec un peu d'effort de création d'un modèle de cela, il wold travailler avec une liste d'objets.