_tmain
ไม่มีอยู่ใน C ++ main
ทำ.
_tmain
เป็นส่วนเสริมของ Microsoft
main
คือตามมาตรฐาน C ++ จุดเข้าใช้งานของโปรแกรม มันมีหนึ่งในสองลายเซ็นเหล่านี้:
int main();
int main(int argc, char* argv[]);
Microsoft ได้เพิ่ม wmain ซึ่งแทนที่ลายเซ็นที่สองด้วยสิ่งนี้:
int wmain(int argc, wchar_t* argv[]);
แล้วจะทำให้มันง่ายต่อการสลับไปมาระหว่าง Unicode (UTF-16) และสัญลักษณ์ชุดอักขระของพวกเขาได้กำหนดไว้_tmain
ซึ่งหาก Unicode ถูกเปิดใช้งานจะถูกรวบรวมเป็นและเป็นอย่างอื่นwmain
main
สำหรับส่วนที่สองของคำถามของคุณส่วนแรกของปริศนาคือหน้าที่หลักของคุณผิด wmain
ควรจะโต้แย้งไม่ได้wchar_t
char
เนื่องจากคอมไพเลอร์ไม่บังคับใช้main
ฟังก์ชันนี้คุณจะได้รับโปรแกรมที่wchar_t
ส่งผ่านอาร์เรย์ของสตริงไปยังmain
ฟังก์ชันซึ่งแปลความหมายเหล่านั้นเป็นchar
สตริง
ตอนนี้ใน UTF-16 ชุดอักขระที่ใช้โดย Windows เมื่อเปิดใช้งาน Unicode อักขระ ASCII ทั้งหมดจะแสดงเป็นคู่ของไบต์\0
ตามด้วยค่า ASCII
และเนื่องจากซีพียู x86 นั้นเป็นแบบเอนด์เอนด์ลำดับของไบต์เหล่านี้จึงถูกสับเปลี่ยนดังนั้นค่า ASCII จะมาก่อนจากนั้นตามด้วยไบต์ว่าง
และในสตริงอักขระสตริงมักจะยกเลิกอย่างไร ใช่แล้วโดย null null ดังนั้นโปรแกรมของคุณจะเห็นสตริงจำนวนหนึ่งยาวหนึ่งไบต์
โดยทั่วไปคุณมีสามตัวเลือกเมื่อทำการเขียนโปรแกรม Windows:
- ใช้ Unicode อย่างชัดแจ้ง (โทร wmain และสำหรับทุกฟังก์ชั่น Windows API ที่รับอาร์กิวเมนต์ที่เกี่ยวข้องกับถ่านให้เรียก
-W
รุ่นของฟังก์ชันแทน CreateWindow ให้โทร CreateWindowW) และแทนที่จะใช้การchar
ใช้งานwchar_t
เป็นต้น
- ปิดใช้งาน Unicode อย่างชัดเจน โทรหลักและ CreateWindowA และใช้
char
สำหรับสตริง
- อนุญาตให้ทั้งสอง (โทร _tmain และ CreateWindow ซึ่งแก้ไขเป็นหลัก / _tmain และ CreateWindowA / CreateWindowW) และใช้ TCHAR แทน char / wchar_t
เช่นเดียวกับชนิดสตริงที่กำหนดโดย windows.h: LPCTSTR จะเปลี่ยนเป็น LPCSTR หรือ LPCWSTR และสำหรับประเภทอื่น ๆ ทุกประเภทที่มีอักขระ char หรือ wchar_t รุ่น -T- จะมีอยู่ซึ่งสามารถใช้แทนได้
โปรดทราบว่าทั้งหมดนี้เป็นเฉพาะของ Microsoft TCHAR ไม่ใช่ประเภท C ++ มาตรฐานเป็นมาโครที่กำหนดใน windows.h wmain และ _tmain ถูกกำหนดโดย Microsoft เท่านั้น