2009-10-10 84 views
14

Tôi có một mảng TCHAR trong mã C++ mà tôi muốn gán các chuỗi tĩnh cho nó.Cách gán giá trị cho một mảng TCHAR

tôi đặt một chuỗi ban đầu để nó qua

TCHAR myVariable[260] = TEXT("initial value"); 

Tất cả mọi thứ hoạt động tốt về vấn đề này. Tuy nhiên, khi tôi chia nó thành hai dòng như trong

TCHAR myVariable[260]; 
myVariable = TEXT("initial value"); 

nó lỗi và đưa ra một lỗi biên dịch:

error C2440: '=': cannot convert from 'const char [14]' to 'TCHAR [260]'

nên không phải là TEXT() chức năng làm chính xác những gì tôi muốn ở đây? chuyển đổi chuỗi đã cho thành TCHAR s? Tại sao nó hoạt động, khi đặt hai dòng lại với nhau? Tôi phải thay đổi điều gì để nó hoạt động?

Một số điều khó hiểu khác mà tôi đã gặp phải:

Tôi đã tìm kiếm trên Internet cho nó và đã thấy rằng cũng có _T()_TEXT()__T()__TEXT(). Chúng là gì? Tôi nên sử dụng cái nào trong môi trường nào?

Trả lời

19

Lý do nhiệm vụ không hoạt động có rất ít việc phải làm với TCHAR s và _T. Sau đây sẽ không hoạt động.

char var[260]; 
var = "str"; // fails 

Lý do là trong C và C++ bạn không thể gán trực tiếp mảng. Thay vào đó, bạn phải sao chép từng phần tử (sử dụng, ví dụ: strcpy hoặc trong trường hợp của bạn _tcscpy).

strcpy(var, "str"); 

Về phần thứ hai của câu hỏi của bạn, TEXT, _T và những người khác là macro, rằng trong Unicode xây dựng lần lượt một chuỗi chữ đến một rộng chuỗi chữ. Trong các bản dựng không phải Unicode, chúng không làm gì cả.

+1

+1 để avakar. Trên một mặt lưu ý, sử dụng TCHAR thay vì WCHAR hoặc char, tùy thuộc vào thiết lập dự án của bạn (Unicode/ASCII) macro TCHAR sẽ được định nghĩa là WCHAR/char. Và tương tự như vậy, sử dụng các hàm bảo mật dựa trên _t như _tcscpy_s, _tcscat_s, v.v. sẽ được định nghĩa lại dựa trên proj của bạn. cài đặt như wcscpy hoặc strcpy. 2 xu của tôi. – legends2k

+0

Tôi đã thử điều này, có lỗi này: lỗi C2664: 'wcscpy': không thể chuyển đổi tham số 2 từ 'const char [8]' thành 'const wchar_t *' –

+0

@ user396483, đã thử cái gì? Bạn rõ ràng là trộn các phiên bản str, _tcs và wcs với nhau. – avakar

5

See avakar's answer for the direct answer. I was going to add this as a comment, but it really is a freestanding recommendation. I will warn you up from that this will sound like a rant but it does come from using TCHAR and then working issues for a few years before trying to remove it from a rather large codebase.

Đảm bảo rằng bạn thực sự hiểu tác dụng của việc sử dụng TCHAR mảng và bạn bè của họ. Chúng rất khó sử dụng đúng cách. Dưới đây là một danh sách ngắn các điều mà bạn phải coi chừng:

  • sizeof(TCHAR) có điều kiện: Xem xét kỹ lưỡng mã có chứa này. Nếu nó đang làm bất cứ điều gì khác hơn là tính toán kích thước đang được chuyển đến malloc() hoặc memcpy() thì có thể là sai.
  • TCHAR là một loại bí danh: Kể từ TCHAR là gì khác hơn là một typedef, nó là rất dễ dàng để viết những thứ như wcscpy(tszStr, wszAry) và được không khôn ngoan hơn. Về cơ bản, TCHARhoặcchar hoặc wchar_t để lựa chọn quá tải có thể làm bạn ngạc nhiên.
  • wsprintf()swprintf() khác nhau: Đây là trường hợp đặc biệt của trường hợp trước đó nhưng nó đặc biệt cân nhắc vì rất dễ nhầm lẫn ở đây!

Nếu bạn muốn sử dụng TCHAR, sau đó hãy chắc chắn rằng bạn biên dịch cả UNICODE và MBCS phiên bản thường xuyên. Nếu bạn không làm điều này, sau đó bạn có thể sẽ hoàn tác bất kỳ lợi thế mà bạn đang cố gắng để đạt được bằng cách sử dụng chúng ở nơi đầu tiên.

Dưới đây là hai khuyến nghị mà tôi có để không sử dụng TCHAR ngay từ đầu khi bạn đang viết mã C++.

  1. Sử dụng CString nếu bạn đang sử dụng MFC hoặc thoải mái tự gắn với MSFT.
  2. Sử dụng std::string hoặc std::wstring kết hợp với API loại cụ thể - sử dụng CreateFileA()CreateFileW() nếu thích hợp.

Cá nhân, tôi chọn sau này nhưng mã hóa ký tự và các vấn đề chuyển mã chuỗi chỉ là một cơn ác mộng theo thời gian.

+0

+1, ban đầu tôi đã xem xét việc viết một đoạn trích tương tự. Cá nhân, tôi luôn sử dụng 'std :: string' với dữ liệu được mã hóa utf-8, chỉ mã hóa tại các ranh giới API (tức là trước khi gọi hàm win32 API). – avakar

+0

@avakar: chúng tôi đã thực hiện cả chuỗi UTF-8 + std :: string và UCS-2 + std :: wstring. Tôi đã đưa đến sau này vì trường hợp gấp và so sánh dễ dàng hơn nhiều trong Unicode hơn UTF-8. –

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