質問

CString ヘッダー ファイル内 (Microsoft または Open Foundation Classes のいずれか) http://www.koders.com/cpp/fid035C2F57DD64DBF54840B7C00EA7105DFDAA0EBD.aspx#L77 )、次のコードスニペットがあります

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

は何ですか (TCHAR*)(&this[1]) 示す?

CStringData 構造体は、CString クラス (http://www.koders.com/cpp/fid100CC41B9D5E1056ED98FA36228968320362C4C1.aspx) で使用されます。

助けていただければ幸いです。

役に立ちましたか?

解決

CString には、渡されたときに通常の文字列のように見えるようにする内部トリックがたくさんあります。に printf 実際にはクラスであるにもかかわらず、関数 - にキャストする必要がなく、 LPCTSTR 引数リスト内、たとえば次の場合 varargs (...) 例:ある printf. 。したがって、CString 実装の単一の個別のトリックや関数を理解しようとするのは悪い知らせです。(データ関数は、文字列に関連付けられた「実際の」バッファを取得する内部関数です。)

これについては『MFC Internals』とい​​う本があり、IIRC の Blaszczak の本がそれに触れる可能性があります。

編集:この式が生の C++ の観点から実際にどのように変換されるかについては、次のとおりです。

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

これは、「実際に一緒に割り当てられた項目の配列の最初のエントリであると仮定してください。さて、2 番目の項目は実際には CString, 、これは Unicode または通常の文字の通常の NUL 終了バッファ、つまり LPTSTR です。

同じことを別の方法で表現すると次のようになります。

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

T へのポインタに 1 を加算すると、実際には生のメモリ アドレスに換算して T のサイズの 1* が加算されます。したがって、CString が sizeof(CString) = 4 で 0x00000010 にある場合、データは 0x00000014 で始まる NUL で終了する文字バッファーの配列へのポインターを返します。

しかし、この 1 つのことを文脈から理解するだけでは、必ずしも良いアイデアとは限りません。

なぜあなたはやる 必要 知るには?

他のヒント

CStringData 構造体の直後のメモリ領域を TCHAR 文字の配列として返します。

彼らがなぜこんなことをしているかは、以下を見れば理解できます。 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