أي بنية سلسلة عريضة تستخدمها؟ cstring مقابل wstring
سؤال
لديّ تطبيق MFC في C ++ يستخدم STD :: String و Std :: WSTRING ، وكثيراً ما يلقي من واحد إلى آخر ، والكثير من الهراء الآخر. أحتاج إلى توحيد كل شيء بتنسيق واحد ، لذلك كنت أتساءل عما إذا كان ينبغي علي الذهاب مع CSTRING أو STD :: WSTRING.
في التطبيق ، سأحتاج إلى إنشاء سلاسل من جدول سلسلة ، والعمل مع الكثير من مكالمات Windows التي تتطلب مؤشرات THARCH أو WCHAR_T ثابتة ، وتحرير عناصر التحكم ، والتفاعل مع واجهة برمجة تطبيقات كائن COM تتطلب BSTR.
لدي أيضًا متجهات من السلاسل ، فهل هناك أي مشكلة مع متجه من CSTRINGS؟
أيهما أفضل؟ ما هي إيجابيات وسلبيات كل منها؟
أمثلة
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;
مورد سلسلة إلى WSTRING
CString t;
wstring url;
t.LoadString(IDS_SCRIPTURL);
url = t;
getProfiLestring () يعيد cstring.
عدد صحيح لتنسيق السلسلة:
wchar_t total[32];
swprintf_s(total, 32, L"%d", trk->getInt());
wstring tot(total);
المحلول
std :: basic_string <> (أو بالأحرى تخصصاته) أمر مروع للعمل معه ، إنه أحد أوجه القصور الرئيسية لـ STL (وأقول C ++ بشكل عام). لا يعرف حتى عن الترميزات - هيا ، هذا هو عام 2010. أن تكون قادرًا على تحديد حجم شخصيتك لا يكفي ، "لأن لا توجد طريقة تشير إلى أحرف متغيرة الحجم في basic_string <>. الآن ، UTF-8 ليس من الجيد العمل مع CSTRING ، لكنه ليس سيئًا مثل محاولة القيام بذلك باستخدام Basic_String. على الرغم من أنني أتفق مع روح الملصقات المذكورة أعلاه على أن الحل القياسي أفضل من البدائل ، فإن Cstring هو (إذا كان مشروعك يستخدم MFC أو ATL على أي حال) أجمل بكثير للعمل مع STD :: String/WSTRING: التحويلات بين ANSI/UNICODE (من خلال Cstringa و CStringw) ، BSTR ، التحميل من جدول السلسلة ، مشغلات المصبوب إلى Tchar (.c_str ()؟ حقًا؟) ، ...
يحتوي Cstring أيضًا على تنسيق () ، والذي ، على الرغم من أنه ليس آمنًا وقبيحًا إلى حد ما ، مناسب. إذا كنت تفضل مكتبات التنسيق الآمن ، فستكون أفضل حالًا مع Basic_String.
علاوة على ذلك ، يحتوي Cstring على بعض الخوارزميات كوظائف الأعضاء التي ستحتاج إليها في زيادة الأدوات المساعدة للسلسلة للقيام بها على basic_string مثل التقليم ، والانقسام وما إلى ذلك.
ناقلات Cstring ليست مشكلة.
حذر من الفصل الدوائي لـ Cstring على أساس كونه Windows فقط: إذا كنت تستخدمه في واجهة المستخدم الرسومية Windows ، فإن التطبيق هو Windows فقط على أي حال. ومع ذلك ، إذا كان هناك أي فرصة لأن يكون رمزك بحاجة إلى أن يكون منصة متعددة في المستقبل ، فستكون عالقًا مع Basic_String <>.
نصائح أخرى
أنا شخصيا سأذهب مع CString
في هذه الحالة ، لأنك ذكرت أنك تعمل معها BSTR
S ، باستخدام com ، وكتابة هذا في MFC. بينما wstring
ستكون S أكثر امتثالًا للمعايير ، ستواجه مشكلات مع التحويل المستمر من واحد إلى آخر. نظرًا لأنك تعمل مع COM وكتابتها في MFC ، فلا يوجد سبب حقيقي يدعو للقلق بشأن جعلها متشابكة ، نظرًا لعدم وجود نظام تشغيل آخر مثل Windows و MFC يقوم بالفعل بإغلاقك في Windows.
كما لاحظت ، CString
S أيضا وظائف مدمجة للمساعدة في تحميل السلاسل والتحويل إليها BSTR
S وما شابه ، جميعها مصنوعة مسبقًا ومصنوعة بالفعل للعمل مع Windows. لذا ، بينما تحتاج إلى توحيد تنسيق واحد ، فلماذا لا تسهل العمل معه؟
سيكون STD :: WSTRING أكثر محمولة ، ويستفيد من الكثير من التعليمات البرمجية الموجودة مسبقًا في STL وفي التعزيز. من المحتمل أن يتحسن Cstring مع Windows API.
WCHAT_T: تذكر أنه يمكنك إخراج البيانات من WSTRING في أي وقت باستخدام وظيفة البيانات () ، بحيث تحصل على مؤشر WCHAR_T المطلوب على أي حال.
BSTR: استخدم sysallocstring للحصول على BSTR من wstring.data ().
أما بالنسبة لاعتماد النظام الأساسي ، تذكر أنه يمكنك استخدامه std::basic_string<T>
لتحديد السلسلة الخاصة بك ، استنادًا إلى ما تريد أن يكون طول حرف واحد.
سأذهب إلى WSTRING كل يوم ....