_tmaintidak ada di C ++. maintidak.
_tmain adalah ekstensi Microsoft.
mainadalah, 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. wmainharus mengambil wchar_targumen, bukan char. Karena kompiler tidak menjalankan ini untuk mainfungsi, Anda mendapatkan program di mana array wchar_tstring diteruskan ke mainfungsi, yang menafsirkannya sebagai charstring.
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
-Wversi fungsi. Alih-alih CreateWindow, panggil CreateWindowW). Dan alih-alih menggunakan chargunakan wchar_t, dan sebagainya
- Nonaktifkan Unicode secara eksplisit. Panggil main, dan CreateWindowA, dan gunakan
charuntuk 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.