_tmainnie istnieje w C ++. mainrobi.
_tmain jest rozszerzeniem Microsoft.
mainjest, 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, _tmainktó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. wmainpowinien wziąć wchar_targument, nie char. Ponieważ kompilator nie wymusza tego dla mainfunkcji, otrzymujesz program, w którym tablica wchar_tciągów znaków jest przekazywana do mainfunkcji, która interpretuje je jako charcią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, \0po 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
-Wwersję funkcji. Zamiast CreateWindow, wywołaj CreateWindowW). I zamiast używać charuse wchar_t, i tak dalej
- Jawnie wyłącz Unicode. Wywołaj main, CreateWindowA i użyj
chardla ł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.