_tmainC ++ 'da mevcut değildir. mainyapar.
_tmain bir Microsoft uzantısıdır.
mainC ++ 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 wmainve 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. wmainBir almalı wchar_t, argüman değil char. Derleyici mainişlev için bunu zorlamadığından, işleve bir dizi wchar_tdizenin geçtiği ve mainbunları chardizgi 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 \0ardı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
-Wiçin işlevin sürümünü çağırın . CreateWindow yerine CreateWindowW çağırın). Ve kullanmak yerine charkullanılmasını wchar_tve benzeri
- Unicode'u açıkça devre dışı bırakın. Main ve CreateWindowA öğelerini çağırın ve
chardizeler 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.