2011-02-08 36 views
7

Tôi mới sử dụng mã C++, đến từ nền Java và C#. Tôi đang bối rối bởi sự gia tăng của các điều khoản #define bắt đầu với cơ bản nhất:Tại sao có macro xác định _tmain?

#define _tmain wmain 

Khi tôi lần đầu tiên học được một ít C từ lâu, chức năng chính là:

int main(int argc, char *argv[]) 

Trong Visual C++ dự án tôi tạo ra, nó làm cho các chức năng chính:

int _tmain(int argc, _TCHAR* argv[]) 

tôi chỉ tự hỏi tại sao lại có cần thiết để trở thành một dịch tên từ wmain để _tmain? Tại sao không chỉ sử dụng nguyên mẫu chức năng C main gốc?

Nói chung có vẻ như rất nhiều #define đổi tên một cái gì đó trông khá rõ ràng để bắt đầu, với một cái gì đó trông bí ẩn hơn và ít rõ ràng hơn (tôi có nghĩa là wmain đến _tmain ??).

Cảm ơn bạn đã chịu đựng những gì có thể là một câu hỏi rất rõ ràng.

+7

Đó là nội dung cụ thể cho Windows, không có gì liên quan đến Chuẩn C++ (cũng không phải C). Họ (tại Microsoft) có thói quen xấu về các kế hoạch đặt tên khủng khiếp và làm phức tạp những thứ không cần thiết. –

+2

Ngày xửa ngày xưa, ai đó nghĩ rằng đây là một ý tưởng hay để giúp mọi người di chuyển từ các phiên bản Windows cũ hơn bằng cách sử dụng char sang phiên bản mới hơn khi sử dụng wchar_t. Nó không phải là, và bây giờ nó chỉ gây nhầm lẫn cho mọi người! –

+1

Liên quan: http://stackoverflow.com/questions/234365/is-tchar-still-relevant – dan04

Trả lời

13

Đây là một tính năng cụ thể của Visual C++, nó không phải là một phần của C++.

Hầu hết các chức năng của Windows API có hai phiên bản: những người kết thúc trong W, mà là để sử dụng với chuỗi rộng ký tự (wchar_t dây) và những kết thúc bằng A, mà là để sử dụng với chuỗi kí tự hẹp (char dây). Các hàm Windows API "thực tế" không có bất kỳ hậu tố nào và được định nghĩa là các macro mở rộng sang phiên bản phù hợp tùy thuộc vào các cài đặt.

Các T tên (như _TCHAR_tmain) đều mang cùng một mục đích: họ là macro mà mở rộng ra đúng tên tùy thuộc vào các thiết lập biên dịch của bạn, vì vậy wchar_twmain cho hỗ trợ nhân vật rộng, hoặc charmain cho nhân vật hẹp ủng hộ. Ý tưởng là nếu bạn viết mã của mình bằng cách sử dụng tên nhân vật bất khả tri (tên T), bạn có thể biên dịch mã của mình để sử dụng ký tự hẹp (ASCII) hoặc ký tự rộng (Unicode) mà không thay đổi. Sự cân bằng là mã của bạn ít di động hơn.

+0

Cảm ơn rất nhiều. Đó là một cái nhìn tổng quan tuyệt vời.Từ quan điểm thực tế, hầu hết các nhà phát triển cố gắng tránh các quy ước Visual C++ để gắn bó với chuẩn C++, hoặc là giả định rằng nếu bạn đang phát triển trên Windows, chỉ cần sử dụng các quy ước Visual C++? –

+0

@Sam: Điều đó phụ thuộc. Nếu bạn đang viết mã sử dụng nhiều API Windows, nó có thể rất hữu ích để bạn sử dụng 'TCHAR' và bạn bè. Nếu bạn đang viết mã mà cần phải được di động trên nhiều nền tảng, sau đó bạn không muốn sử dụng 'TCHAR' và bạn bè. Tôi đã thực hiện rất ít chương trình C++ dành riêng cho Windows, vì vậy tôi có lẽ không phải là người tốt nhất để hỏi. Tất cả các dự án lớn mà tôi đã làm việc trong C++ đã có tính di động như là một yêu cầu hàng đầu. –

+2

@Sam: Vì bạn nói rằng bạn mới làm quen với lập trình C++, tôi khuyên bạn nên học viết C++ di động trước và học cách tránh các phần mở rộng ngôn ngữ và các tính năng nền tảng cụ thể bất cứ khi nào có thể. Cố gắng viết mã phụ thuộc vào nền tảng chỉ khi bạn phải (ví dụ: khi bạn phải tương thích với hệ điều hành hoặc sử dụng chức năng không thể truy cập thông qua Thư viện chuẩn C++). Khi bạn phải sử dụng mã nền tảng cụ thể, hãy thử cách ly mã này càng nhiều càng tốt để bạn có thể chuyển mã dễ dàng sang các nền tảng khác nếu bạn phải. –

5

Bởi vì Microsoft quyết định rằng cách tốt nhất để thêm hỗ trợ Unicode để C++ là thêm một loại TCHAR, đượC#defined hoặc là char hoặc wchar_t tùy thuộc vào giá trị của Project Properties> Configuration Properties> General> Character Set. _tmain cũng đượC#defined là main (mất char s) hoặc wmain (mất wchar_t s) tùy thuộc vào cài đặt đó.

+0

Thực sự hữu ích khi biết! Cảm ơn. –

+2

@Sam: Thật không may là nhóm hệ điều hành Windows là các chuyên gia C, vì vậy họ đã sử dụng #define thay vì typedef và macro thay vì các hàm nội tuyến. Điều này đã giới thiệu hàng nghìn macro khó chịu vào các tiêu đề cửa sổ, bạn sẽ nhận thấy khi một trong số chúng vô tình khớp với một trong các tên hàm của bạn. :-( –

+1

Các nhà phát triển Unix, mặt khác, quyết định cách tốt nhất để thêm hỗ trợ Unicode vào C++ là sử dụng UTF-8. – dan04

Các vấn đề liên quan