2010-01-15 29 views
25

Ví dụ:Tôi có nên sử dụng _T hoặc _TEXT trên các chuỗi ký tự C++ không?

// This will become either SomeMethodA or SomeMethodW, 
// depending on whether _UNICODE is defined. 
SomeMethod(_T("My String Literal")); 

// Becomes either AnotherMethodA or AnotherMethodW. 
AnotherMethod(_TEXT("My Text")); 

Tôi đã xem cả hai. _T có vẻ là ngắn gọn và _TEXT cho rõ ràng. Đây có phải chỉ là một sở thích lập trình chủ quan hay nó là kỹ thuật hơn thế? Ví dụ, nếu tôi sử dụng một trong những khác, mã của tôi sẽ không biên dịch chống lại một hệ thống cụ thể hoặc một số phiên bản cũ của một tập tin tiêu đề?

+2

Điều này có phải có thẻ hình ảnh C++ trên đó hay là _T() phổ biến trong các triển khai? –

+1

Ngoài ra còn có một macro 'TEXT' (không có dấu gạch dưới hàng đầu) từ tệp tiêu đề Windows. Cách thứ tư (và ngắn nhất) là sử dụng các chuỗi “rộng” ('L”… ”') ở mọi nơi — Windows 98/Me không được sử dụng rộng rãi nữa. – Philipp

Trả lời

21

Một grep đơn giản của SDK cho chúng ta thấy rằng câu trả lời là nó không quan trọng-họ đều giống nhau. Cả hai biến thành __T(x).

 
C:\...\Visual Studio 8\VC>findstr /spin /c:"#define _T(" *.h 
crt\src\tchar.h:2439:#define _T(x)  __T(x) 
include\tchar.h:2390:#define _T(x)  __T(x) 

C:\...\Visual Studio 8\VC>findstr /spin /c:"#define _TEXT(" *.h 
crt\src\tchar.h:2440:#define _TEXT(x) __T(x) 
include\tchar.h:2391:#define _TEXT(x) __T(x) 

Và cho đầy đủ:

 
C:\...\Visual Studio 8\VC>findstr /spin /c:"#define __T(" *.h 
crt\src\tchar.h:210:#define __T(x)  L ## x 
crt\src\tchar.h:889:#define __T(x)  x 
include\tchar.h:210:#define __T(x)  L ## x 
include\tchar.h:858:#define __T(x)  x 

Tuy nhiên, về mặt kỹ thuật , cho C++ bạn nên sử dụng TEXT() thay vì _TEXT(), nhưng nó (cuối cùng) mở rộng để điều tương tự quá.

+0

Thú vị. Chúng không chỉ giống nhau, chúng được định nghĩa trong cùng một tiêu đề. Tôi đã có giả định sai lầm rằng _TEXT là Win32 và _T là ATL. –

+0

@Max: Chúng cũng được xác định, kỳ quặc, trong MAPINls.h và MAPIWin.h, nhưng tôi không chắc chắn tại sao, và tôi loại trừ chúng khỏi kết quả ở trên để đơn giản. Nhưng vâng, chúng không phải là thứ ATL mà chúng là những thứ Win32. Có thể tài liệu ATL sử dụng nó vì họ thích nó tốt hơn? ATL là tất cả về việc tiết kiệm bạn gõ phải không? :) –

6

Tôi chưa từng thấy ai sử dụng _TEXT() thay vì _T().

19

Cam kết Unicode và chỉ sử dụng L"My String Literal".

+6

+1 để cam kết Unicode; -1 cho đào vô nghĩa tại Microsoft. –

+0

Chuyển đổi sang Unicode không nhất thiết phải có thể tại thời điểm bạn đang viết một đoạn mã. Trong khi đó, sử dụng _T() có nghĩa là không ai sẽ phải thay đổi mã của bạn khi nó được chuyển đổi. –

+0

Không, có * không bao giờ * lý do chính đáng để quay lại. –

8

Here là một bài đọc thú vị từ một nguồn nổi tiếng và được tôn trọng.

Tương tự, macro _TEXT sẽ ánh xạ tới L "..." thay vì "...".

Còn về _T? Được rồi, tôi không biết về điều đó. Có lẽ nó chỉ là để tiết kiệm một số người gõ.

+3

Bạn đã để lại một bit chính: _TEXT ("hello") == L "hello" CHỈ nếu UNICODE được xác định. Và có, _T ("hello") chỉ là một từ viết tắt. – egrunin

+1

Cả hai 'UNICODE' và' _UNICODE' phải luôn luôn được xác định trừ khi bạn đang lên kế hoạch du lịch thời gian đến những năm chín mươi. – Philipp

4

Không. Theo kinh nghiệm của tôi, có hai loại chuỗi ký tự cơ bản, những thứ bất biến và những thứ cần được dịch khi mã của bạn được bản địa hóa.

Điều quan trọng là phải phân biệt giữa hai khi bạn viết mã để bạn không phải quay lại và tìm ra cái nào sau này.

Vì vậy, tôi sử dụng _UT() cho các chuỗi không thể dịch được, và ZZT() (hoặc một thứ khác dễ tìm kiếm) cho các chuỗi cần được dịch. Các trường hợp của _T() hoặc _TEXT() trong mã là bằng chứng về các chuỗi ký tự chuỗi chưa được phân loại chính xác.

_UTZZT đều #defined để _TEXT

+0

Bạn nên có một hệ thống tốt hơn để bản địa hóa các chuỗi hơn tìm kiếm/thay thế. –

+0

Tôi thích ý tưởng đó. Tôi đã có đủ rắc rối để tìm ra những chuỗi nào được hiển thị cho người dùng (và do đó cần được dịch) và nó đi đến các tệp nhật ký (không nên). –

+0

@Mark: Điều gì làm bạn nghĩ rằng tôi không? –

12

Từ Raymond Chen:

TEXT vs _TEXT vs _T, và UNICODE vs _UNICODE

Các phiên bản đơn giản mà không gạch ảnh hưởng đến các ký tự đặt các tập tin tiêu đề của Windows xử như mặc định . Vì vậy, nếu bạn định nghĩa UNICODE, thì GetWindowText sẽ ánh xạ tới GetWindowTextW thay vì GetWindowTextA, chẳng hạn. Tương tự, macro TEXT sẽ ánh xạ tới L "..." thay vì "...".

Các phiên bản có dấu gạch dưới ảnh hưởng đến ký tự đặt thời gian chạy C các tệp tiêu đề coi là mặc định. Vì vậy, nếu bạn xác định _UNICODE, thì _tcslen sẽ ánh xạ tới wcslen thay vì strlen, ví dụ . Tương tự, macro _TEXT sẽ ánh xạ tới L "..." thay vì "...".

Còn về _T? OK, tôi không biết về điều đó. Có lẽ nó chỉ là để lưu ai đó một số gõ.

phiên bản ngắn: _T() là một người đàn ông lười biếng của _TEXT()

Lưu ý: Bạn cần phải nhận thức được những gì mã trang soạn thảo code văn bản nguồn của bạn đang sử dụng khi bạn viết:

_TEXT("Some string containing Çontaining"); 
TEXT("€xtended characters."); 

Các byte trình biên dịch thấy phụ thuộc vào trang mã của trình soạn thảo của bạn.

4

Các macro này được giữ lại từ những ngày mà ứng dụng có thể thực sự muốn biên dịch cả phiên bản unicode và ANSI.

Không có lý do gì để thực hiện việc này ngay hôm nay - đây là tất cả các di tích. Microsoft bị mắc kẹt với việc hỗ trợ mọi cấu hình có thể có mãi mãi, nhưng bạn thì không. Nếu bạn không biên dịch cả hai ANSI và Unicode (và không có ai, hãy trung thực) chỉ cần đi đến với L "văn bản".

Và có, trong trường hợp nó không phải là rõ ràng bây giờ: _T == _TEXT

-2

Sử dụng không, và cũng xin đừng sử dụng L "..." tào lao. Sử dụng UTF-8 cho tất cả các chuỗi và chuyển đổi chúng ngay trước khi chuyển sang các API của microsoft.

+2

Tùy chọn tồi tệ nhất có thể có trên Windows, sẽ yêu cầu hàng triệu chuyển đổi chuỗi không cần thiết. Luôn sử dụng UTF-16. – Philipp

+0

Không đồng ý về mặt phân loại. Xem, ví dụ: http://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful tại sao UTF-16 có hại trên cửa sổ. –

+0

UTF-16 có nên được coi là có hại không? - https://programmers.stackexchange.com/questions/102205/should-utf-16-be-considered-harmful –

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