_tmain
C ++ 'da mevcut değildir. main
yapar.
_tmain
bir Microsoft uzantısıdır.
main
C ++ standardına göre, programın giriş noktasıdır. Bu iki imzadan birine sahiptir:
int main();
int main(int argc, char* argv[]);
Microsoft, ikinci imzayı bununla değiştiren bir wmain ekledi:
int wmain(int argc, wchar_t* argv[]);
Ve sonra, Unicode (UTF-16) ve çok baytlı karakter kümeleri arasında geçiş yapmayı kolaylaştırmak için _tmain
, Unicode etkinleştirilirse, olarak wmain
ve başka bir şekilde derlendiğini tanımladılar main
.
Sorunuzun ikinci kısmına gelince, bulmacanın ilk kısmı ana işlevinizin yanlış olmasıdır. wmain
Bir almalı wchar_t
, argüman değil char
. Derleyici main
işlev için bunu zorlamadığından, işleve bir dizi wchar_t
dizenin geçtiği ve main
bunları char
dizgi olarak yorumlayan bir program alırsınız .
Şimdi, UTF-16'da, Unicode etkinleştirildiğinde Windows tarafından kullanılan karakter kümesi, tüm ASCII karakterleri bayt çifti ve \0
ardından ASCII değeri olarak temsil edilir .
Ve x86 CPU küçük endian olduğundan, bu baytların sırası değiştirilir, böylece ASCII değeri önce gelir, ardından boş bir bayt gelir.
Ve bir karakter dizesinde, karakter dizisi genellikle nasıl sonlandırılır? Evet, boş bir bayt tarafından. Programınız her biri bayt uzunluğunda bir dizi dizgi görür.
Genel olarak, Windows programlama yaparken üç seçeneğiniz vardır:
- Unicode'u açıkça kullanın (wmain'i çağırın ve karakterle ilgili bağımsız değişkenleri alan her Windows API işlevi
-W
için işlevin sürümünü çağırın . CreateWindow yerine CreateWindowW çağırın). Ve kullanmak yerine char
kullanılmasını wchar_t
ve benzeri
- Unicode'u açıkça devre dışı bırakın. Main ve CreateWindowA öğelerini çağırın ve
char
dizeler için kullanın .
- Her ikisine de izin ver. (_tmain ve main / _tmain ve CreateWindowA / CreateWindowW için çözümlenen CreateWindow'u çağırın) ve char / wchar_t yerine TCHAR kullanın.
Aynısı windows.h tarafından tanımlanan dize türleri için de geçerlidir: LPCTSTR, LPCSTR veya LPCWSTR olarak çözümlenir ve char veya wchar_t içeren diğer tüm türler için her zaman bunun yerine kullanılabilecek bir -T- sürümü vardır.
Tüm bunların Microsoft'a özgü olduğunu unutmayın. TCHAR standart bir C ++ türü değil, windows.h dosyasında tanımlanan bir makrodur. wmain ve _tmain yalnızca Microsoft tarafından tanımlanır.