_tmain
không tồn tại trong C ++. main
làm.
_tmain
là một phần mở rộng của Microsoft.
main
là, theo tiêu chuẩn C ++, điểm vào của chương trình. Nó có một trong hai chữ ký sau:
int main();
int main(int argc, char* argv[]);
Microsoft đã thêm một wmain thay thế chữ ký thứ hai bằng chữ này:
int wmain(int argc, wchar_t* argv[]);
Và sau đó, để dễ dàng chuyển đổi giữa Unicode (UTF-16) và bộ ký tự đa nhân của họ, họ đã xác định _tmain
cái nào, nếu Unicode được bật, được biên dịch thành wmain
, và ngược lại main
.
Đối với phần thứ hai của câu hỏi của bạn, phần đầu tiên của câu đố là chức năng chính của bạn là sai. wmain
nên wchar_t
tranh luận chứ không phải char
. Vì trình biên dịch không thực thi điều này cho main
hàm, nên bạn nhận được một chương trình trong đó một wchar_t
chuỗi các chuỗi được truyền cho main
hàm, nó diễn giải chúng dưới dạng các char
chuỗi.
Bây giờ, trong UTF-16, bộ ký tự được Windows sử dụng khi bật Unicode, tất cả các ký tự ASCII được biểu diễn dưới dạng cặp byte \0
theo sau giá trị ASCII.
Và vì CPU x86 là endian nhỏ, thứ tự của các byte này được hoán đổi, do đó giá trị ASCII xuất hiện trước, sau đó là byte rỗng.
Và trong một chuỗi char, chuỗi thường được kết thúc như thế nào? Đúng, bởi một byte null. Vì vậy, chương trình của bạn nhìn thấy một chuỗi các chuỗi, mỗi chuỗi dài một byte.
Nói chung, bạn có ba tùy chọn khi thực hiện lập trình Windows:
- Hoàn toàn sử dụng Unicode (gọi wmain và đối với mọi hàm API của Windows có các đối số liên quan đến char, hãy gọi
-W
phiên bản của hàm. Thay vì CreatWindow, hãy gọi CreateWindowW). Và thay vì sử char
dụng wchar_t
, vân vân
- Vô hiệu hóa Unicode. Gọi main và CreateWindowA và sử dụng
char
cho chuỗi.
- Cho phép cả hai. (gọi _tmain và CreateWindow, sẽ phân giải chính / _tmain và CreateWindowA / CreateWindowW) và sử dụng TCHAR thay vì char / wchar_t.
Điều tương tự cũng áp dụng cho các loại chuỗi được xác định bởi windows.h: LPCTSTR phân giải thành LPCSTR hoặc LPCWSTR và đối với mọi loại khác bao gồm char hoặc wchar_t, phiên bản -T- luôn tồn tại có thể được sử dụng thay thế.
Lưu ý rằng tất cả điều này là cụ thể của Microsoft. TCHAR không phải là một loại C ++ tiêu chuẩn, nó là một macro được định nghĩa trong windows.h. wmain và _tmain cũng chỉ được xác định bởi Microsoft.