_tmain
nie istnieje w C ++. main
robi.
_tmain
jest rozszerzeniem Microsoft.
main
jest, zgodnie ze standardem C ++, punktem wejścia programu. Ma jeden z tych dwóch podpisów:
int main();
int main(int argc, char* argv[]);
Microsoft dodał wmain, który zastępuje drugi podpis tym:
int wmain(int argc, wchar_t* argv[]);
Następnie, aby ułatwić przełączanie między Unicode (UTF-16) a ich wielobajtowym zestawem znaków, zdefiniowali, _tmain
który, jeśli włączony jest Unicode, jest kompilowany jako wmain
, a inaczej jako main
.
Jeśli chodzi o drugą część twojego pytania, pierwszą częścią układanki jest to, że twoja główna funkcja jest zła. wmain
powinien wziąć wchar_t
argument, nie char
. Ponieważ kompilator nie wymusza tego dla main
funkcji, otrzymujesz program, w którym tablica wchar_t
ciągów znaków jest przekazywana do main
funkcji, która interpretuje je jako char
ciągi znaków.
Teraz, w UTF-16, zestaw znaków używanych przez Windows, gdy włączony jest Unicode, wszystkie znaki ASCII są reprezentowane jako para bajtów, \0
po których następuje wartość ASCII.
A ponieważ procesor x86 jest little-endian, kolejność tych bajtów jest zamieniana, tak że najpierw pojawia się wartość ASCII, a następnie bajt zerowy.
A w ciągu znaków char, jak zwykle jest zakończony? Tak, bajt zerowy. Więc twój program widzi kilka ciągów znaków, każdy o długości jednego bajtu.
Ogólnie rzecz biorąc, masz trzy opcje podczas programowania w systemie Windows:
- Jawnie użyj Unicode (wywołaj wmain, a dla każdej funkcji Windows API, która pobiera argumenty związane z char, wywołaj
-W
wersję funkcji. Zamiast CreateWindow, wywołaj CreateWindowW). I zamiast używać char
use wchar_t
, i tak dalej
- Jawnie wyłącz Unicode. Wywołaj main, CreateWindowA i użyj
char
dla łańcuchów.
- Pozwól na oba. (wywołaj _tmain i CreateWindow, które rozstrzygają się na main / _tmain i CreateWindowA / CreateWindowW) i użyj TCHAR zamiast char / wchar_t.
To samo dotyczy typów ciągów zdefiniowanych przez windows.h: LPCTSTR rozwiązuje albo LPCSTR albo LPCWSTR, a dla każdego innego typu, który zawiera char lub wchar_t, zawsze istnieje wersja -T-, której można użyć zamiast tego.
Pamiętaj, że wszystko to jest specyficzne dla Microsoft. TCHAR nie jest standardowym typem C ++, jest makrem zdefiniowanym w windows.h. wmain i _tmain są również zdefiniowane tylko przez Microsoft.