سؤال

في ملف رأس CSTRING (كن فئات مايكروسوفت أو فئة الأساس - http://www.koders.com/cpp/fid035c2f57dd64dbf54840b7c00ea7105dfdaa0ebd.aspx#l77. )، هناك مقتطف التعليمات البرمجية التالية

struct CStringData
{   
    long nRefs;
    int nDataLength;
    int nAllocLength;
    TCHAR* data() { return (TCHAR*)(&this[1]); };
    ...
};

ماذا يكون ال (THAR *) (وهذا [1]) يشير؟

يتم استخدام بنية CstringData في فئة CSTRING (http: // www.koders.com/cpp/fid100ccc41b9d5e1056ed98fa36228968320362c4c1.aspx).

أي مساعدة موضع تقدير.

هل كانت مفيدة؟

المحلول

يحتوي CString على الكثير من الحيل الداخلية التي تجعلها تبدو وكأنها سلسلة عادية عندما مرت على سبيل المثال printf وظائف، على الرغم من كونها فئة - دون الحاجة إلى إلقاء ذلك LPCTSTR في قائمة الحجة، على سبيل المثال، في حالة varargs (...) في مثل printf. وبعد وبالتالي فإن محاولة فهم خدعة فردية واحدة أو وظيفة في تنفيذ cstring هو الأخبار السيئة. (وظيفة البيانات هي وظيفة داخلية تحصل على المخزن المؤقت "الحقيقي" المرتبط بالسلسلة.)

هناك كتاب، MFC Internals الذين يدخلونها، و IIRC كتاب Blaszczak قد يلمسه.

تحرير: أما بالنسبة لما يترجم التعبير فعليا من حيث RAW C ++:

TCHAR* data() { return (TCHAR*)(&this[1]); };

يقول هذا "التظاهر بأنك في الواقع الإدخال الأول في صفيف من العناصر المخصصة معا. الآن، البند الثاني ليس في الواقع CString, ، إنه مخزن مؤقت ممنوع طبيعي لإكمال Unicode أو الشخصيات العادية - أي lptstr ".

طريقة أخرى للتعبير عن نفس الشيء هو:

TCHAR* data() { return (TCHAR*)(this + 1); };

عند إضافة 1 إلى مؤشر إلى T، يمكنك بالفعل إضافة 1 * Sizeof T من حيث عنوان ذاكرة خام. لذلك إذا كان لدى المرء CSTRING يقع في 0x00000010 مع Sizeof (cstring) = 4، ستعود البيانات إلى مؤشر إلى صفيف انتهاء NUL من المخزن المؤقت Chars بدءا من 0x00000014

ولكن مجرد فهم هذا الشيء الوحيد خارج السياق ليس بالضرورة فكرة جيدة.

لما انت يحتاج لمعرفة؟

نصائح أخرى

تقوم بإرجاع منطقة الذاكرة الموجودة مباشرة بعد هيكل CstringData كصفيف من أحرف Thar.

يمكنك أن تفهم لماذا يفعلون ذلك إذا نظرتم إلى cstring.cpp. ملف:

static const struct {
    CStringData data;
    TCHAR ch;
} str_empty = {{-1, 0, 0}, 0};

CStringData* pData = (CStringData*)mem_alloc(sizeof(CStringData) + size*sizeof(TCHAR));

يفعلون هذه الخدعة، بحيث يشبه CSTRING وكأنه مخزن مؤقت للبيانات العادي، وعندما تطرح GetDATA، فإنه يتخطى بنية CstringData ونقاطها مباشرة إلى المخزن المؤقت للبيانات الحقيقية مثل Char *

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