2010-01-03 35 views
7

Tôi có một ứng dụng MFC trong C++ sử dụng std :: string và std :: wstring, và thường xuyên phôi từ một đến khác, và một toàn bộ rất nhiều vô nghĩa khác. Tôi cần phải tiêu chuẩn hóa mọi thứ thành một định dạng duy nhất, vì vậy tôi đã tự hỏi nếu tôi nên đi với CString hoặc std :: wstring. Trong ứng dụng, tôi sẽ cần phải tạo chuỗi từ một bảng chuỗi, làm việc với rất nhiều cửa sổ cuộc gọi yêu cầu con trỏ tchar hoặc wchar_t liên tục, Điều khiển chỉnh sửa và tương tác với API của đối tượng COM yêu cầu BSTR.Tôi sử dụng cấu trúc chuỗi ký tự rộng nào? CString vs wstring

Tôi cũng có vectơ chuỗi, vì vậy có bất kỳ vấn đề nào với vec tơ CStrings không?

Cái nào tốt hơn? Những ưu và nhược điểm của mỗi cái là gì?

Ví dụ

BSTR để wstring

CComBSTR tstr; 
wstring album; 
if((trk->get_Info((BSTR *)&tstr)) == S_OK && tstr!= NULL) 
    album = (wstring)tstr; 

wstring để BSTR

CComBSTR tstr = path.c_str(); 
if(trk->set_Info(tstr) == S_OK) 
    return true; 

nguồn String để wstring

CString t; 
wstring url; 
t.LoadString(IDS_SCRIPTURL); 
url = t; 

GetProfileString() trả về một CString.

số nguyên sang định dạng chuỗi:

wchar_t total[32]; 
swprintf_s(total, 32, L"%d", trk->getInt()); 
wstring tot(total); 
+0

Trùng lặp: http://stackoverflow.com/questions/485654/pros-and-cons-of-different-string-types-in-c http://stackoverflow.com/questions/133364/how-do- you-handle-strings-in-c –

+0

Không thực sự là một bản sao - Tôi muốn so sánh hai trường hợp cụ thể của tôi, trong đó có ưu và khuyết điểm cho cả hai. – Vanwaril

Trả lời

10

std :: basic_string <> (hay đúng hơn là chuyên môn của nó) là khủng khiếp để làm việc với, nó imo một trong những thiếu sót lớn của STL (và Tôi muốn nói C++ nói chung). Nó thậm chí không biết về mã hóa - c'mon, đây là năm 2010. Có thể xác định kích thước của nhân vật của bạn là không đủ, vì không có cách nào chỉ ra các ký tự kích thước biến trong một basic_string <>. Bây giờ, utf-8 không phải là tốt đẹp để làm việc với một CString, nhưng nó không phải là xấu như cố gắng để làm điều đó với basic_string. Trong khi tôi đồng ý với tinh thần của các áp phích trên mà một giải pháp tiêu chuẩn tốt hơn các lựa chọn thay thế, CString là (nếu dự án của bạn sử dụng MFC hoặc ATL anyway) tốt hơn nhiều để làm việc với hơn std :: string/wstring: chuyển đổi giữa ANSI/Unicode (thông qua CStringA và CStringW), BSTR, tải từ bảng chuỗi, các toán tử truyền tới TCHAR (.c_str()? thực sự?), ...

CString cũng có Định dạng(), mặc dù không an toàn và hơi xấu , là thuận tiện. Nếu bạn thích thư viện định dạng an toàn hơn, bạn sẽ tốt hơn với basic_string.

Hơn nữa, CString có một số thuật toán như các chức năng thành viên mà bạn sẽ cần các tiện ích tăng chuỗi cho làm trên basic_string như cắt, chia, vv

Vectors của CString là không có vấn đề.

Bảo vệ chống lại việc loại bỏ giáo lý CString theo giáo điều trên cơ sở nó chỉ là Windows: nếu bạn sử dụng nó trong giao diện Windows, ứng dụng vẫn chỉ là Windows. Điều đó đang được nói, nếu có bất kỳ cơ hội nào mà mã của bạn sẽ cần phải là nền tảng chéo trong tương lai, bạn sẽ bị mắc kẹt với basic_string <>.

+0

Vectơ của CString là OK, nhưng bạn cũng có thể sử dụng CStringArray's. – djeidot

2

std :: wstring sẽ được nhiều hơn nữa di động, và hưởng lợi từ rất nhiều mã prewritten hiện trong STL và thúc đẩy. CString có thể sẽ tốt hơn với các API của Windows.

wchat_t: hãy nhớ rằng bạn có thể lấy dữ liệu ra khỏi chuỗi bất kỳ lúc nào bằng cách sử dụng hàm data(), vì vậy, bạn vẫn cần có con trỏ wchar_t cần thiết.

BSTR: sử dụng SysAllocString để lấy BSTR ra khỏi wstring.data().

Đối với nền tảng phụ thuộc, hãy nhớ rằng bạn có thể sử dụng std::basic_string<T> để xác định chuỗi của riêng bạn, dựa trên những gì bạn muốn độ dài của một ký tự.

tôi muốn đi cho wstring mỗi ngày ....

+0

Nhưng với wstring, rất khó tải các tài nguyên chuỗi theo id, và cũng khi tôi cần lấy dữ liệu trong bộ đệm LPC - tôi cần phải tạo các bộ đệm tạm thời, lấy dữ liệu và sau đó tạo wstrings từ chúng. – Vanwaril

+0

Đăng mã, và tôi sẽ đơn giản hóa nó;) - Gần đây tôi đã phải làm việc với điều đó, và đã thất vọng tại CStrings cũng ... –

8

Cá nhân tôi sẽ đi với CString trong trường hợp này, vì bạn tuyên bố rằng bạn đang làm việc với BSTR s, sử dụng COM và viết điều này bằng MFC. Trong khi wstring s sẽ tuân thủ nhiều tiêu chuẩn hơn, bạn sẽ gặp phải các vấn đề với việc chuyển đổi liên tục từ cái này sang cái khác. Kể từ khi bạn đang làm việc với COM và viết nó trong MFC, không có lý do thực sự để lo lắng về việc làm cho nó qua nền tảng, vì không có hệ điều hành khác có COM như Windows và MFC đã khóa bạn vào Windows.

Như bạn đã lưu ý, CString s cũng có các chức năng tích hợp để giúp tải chuỗi và chuyển đổi thành BSTR s và các loại tương tự, tất cả được tạo sẵn và đã được xây dựng để hoạt động với Windows. Vì vậy, trong khi bạn cần phải chuẩn hóa trên một định dạng, tại sao không làm cho nó dễ dàng hơn để làm việc với?

+3

Khi ở Rome, hãy làm như người La Mã làm. –