_tmain
tidak ada di C ++. main
tidak.
_tmain
adalah ekstensi Microsoft.
main
adalah, menurut standar C ++, titik masuk program. Ia memiliki salah satu dari dua tanda tangan ini:
int main();
int main(int argc, char* argv[]);
Microsoft telah menambahkan peringatan yang menggantikan tanda tangan kedua dengan ini:
int wmain(int argc, wchar_t* argv[]);
Dan kemudian, untuk membuatnya lebih mudah untuk beralih antara Unicode (UTF-16) dan set karakter multibyte mereka, mereka telah menentukan _tmain
, jika Unicode diaktifkan, dikompilasi sebagai wmain
, dan sebaliknya sebagaimain
.
Adapun bagian kedua dari pertanyaan Anda, bagian pertama dari teka-teki adalah bahwa fungsi utama Anda salah. wmain
harus mengambil wchar_t
argumen, bukan char
. Karena kompiler tidak menjalankan ini untuk main
fungsi, Anda mendapatkan program di mana array wchar_t
string diteruskan ke main
fungsi, yang menafsirkannya sebagai char
string.
Sekarang, di UTF-16, set karakter yang digunakan oleh Windows ketika Unicode diaktifkan, semua karakter ASCII diwakili sebagai pasangan byte \0
diikuti oleh nilai ASCII.
Dan karena CPU x86 adalah little-endian, urutan byte ini ditukar, sehingga nilai ASCII datang terlebih dahulu, kemudian diikuti oleh byte nol.
Dan dalam string char, bagaimana string biasanya diakhiri? Yap, dengan byte nol. Jadi program Anda melihat banyak string, masing-masing panjangnya satu byte.
Secara umum, Anda memiliki tiga opsi saat melakukan pemrograman Windows:
- Secara eksplisit menggunakan Unicode (panggil wmain, dan untuk setiap fungsi Windows API yang mengambil argumen terkait char, panggil
-W
versi fungsi. Alih-alih CreateWindow, panggil CreateWindowW). Dan alih-alih menggunakan char
gunakan wchar_t
, dan sebagainya
- Nonaktifkan Unicode secara eksplisit. Panggil main, dan CreateWindowA, dan gunakan
char
untuk string.
- Izinkan keduanya. (panggil _tmain, dan CreateWindow, yang memutuskan untuk main / _tmain dan CreateWindowA / CreateWindowW), dan gunakan TCHAR sebagai ganti char / wchar_t.
Hal yang sama berlaku untuk tipe string yang didefinisikan oleh windows.h: LPCTSTR memutuskan untuk LPCSTR atau LPCWSTR, dan untuk setiap tipe lain yang menyertakan char atau wchar_t, versi -T- selalu ada yang dapat digunakan sebagai gantinya.
Perhatikan bahwa semua ini khusus untuk Microsoft. TCHAR bukan tipe C ++ standar, ini adalah makro yang didefinisikan di windows.h. wmain dan _tmain juga hanya ditentukan oleh Microsoft.