سؤال

لديّ تطبيق 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في هذه الحالة ، لأنك ذكرت أنك تعمل معها BSTRS ، باستخدام com ، وكتابة هذا في MFC. بينما wstringستكون S أكثر امتثالًا للمعايير ، ستواجه مشكلات مع التحويل المستمر من واحد إلى آخر. نظرًا لأنك تعمل مع COM وكتابتها في MFC ، فلا يوجد سبب حقيقي يدعو للقلق بشأن جعلها متشابكة ، نظرًا لعدم وجود نظام تشغيل آخر مثل Windows و MFC يقوم بالفعل بإغلاقك في Windows.

كما لاحظت ، CStringS أيضا وظائف مدمجة للمساعدة في تحميل السلاسل والتحويل إليها BSTRS وما شابه ، جميعها مصنوعة مسبقًا ومصنوعة بالفعل للعمل مع Windows. لذا ، بينما تحتاج إلى توحيد تنسيق واحد ، فلماذا لا تسهل العمل معه؟

سيكون STD :: WSTRING أكثر محمولة ، ويستفيد من الكثير من التعليمات البرمجية الموجودة مسبقًا في STL وفي التعزيز. من المحتمل أن يتحسن Cstring مع Windows API.

WCHAT_T: تذكر أنه يمكنك إخراج البيانات من WSTRING في أي وقت باستخدام وظيفة البيانات () ، بحيث تحصل على مؤشر WCHAR_T المطلوب على أي حال.

BSTR: استخدم sysallocstring للحصول على BSTR من wstring.data ().

أما بالنسبة لاعتماد النظام الأساسي ، تذكر أنه يمكنك استخدامه std::basic_string<T> لتحديد السلسلة الخاصة بك ، استنادًا إلى ما تريد أن يكون طول حرف واحد.

سأذهب إلى WSTRING كل يوم ....

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top