문제

Cstring 헤더 파일 (Microsoft 또는 Open Foundation 클래스)에서 - 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 struct는 cstring class (http : // www.koders.com/cpp/fid100cc41b9d5e1056ed98fa3628968320362c4c4c1.aspx에서 사용됩니다.

모든 도움이 감사합니다.

도움이 되었습니까?

해결책

CSTRING은 많은 내부 트릭을 가지고있어 예를 들어 전달할 때 일반 문자열처럼 보이게합니다. printf 실제로 수업 임에도 불구하고 기능 - 캐스팅 할 필요없이 LPCTSTR 인수 목록에서 예를 들어, varargs (...) 예를 들어 a printf. 따라서 CSTRING 구현에서 단일 개별 트릭이나 기능을 이해하려고하는 것은 나쁜 소식입니다. (데이터 함수는 문자열과 관련된 '실제'버퍼를 가져 오는 내부 기능입니다.)

책이 들어가는 MFC 내부 책이 있으며, IIRC는 Blaszczak 책이 그것을 만질 수 있습니다.

편집 : RAW C ++의 관점에서 표현이 실제로 변환되는 것에 대해 :-

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

이것은 "당신이 실제로 함께 할당 된 다양한 항목의 첫 번째 항목 인 척합니다. 이제 두 번째 항목은 실제로 CString, 그것은 유니 코드 또는 일반 문자의 정상적인 NUL 종료 버퍼 (즉, LPTSTR”입니다.

같은 것을 표현하는 또 다른 방법은 다음과 같습니다.

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

1을 t에 포인터에 추가하면 실제로 원시 메모리 주소로 1* sizeof t를 추가합니다. 따라서 크기 (cstring) = 4가있는 0x00000010에 cstring이있는 경우, 데이터는 0x00000014에서 시작하는 NUL 종료 chars 버퍼 배열에 대한 포인터를 반환합니다.

그러나 맥락에서 이것을 이해하는 것만으로도 좋은 생각은 아닙니다.

왜 당신을 필요 알아?

다른 팁

CStringData 구조 직후의 메모리 영역을 TCHA 문자의 배열로 반환합니다.

당신이 왜 그들이 이것을하는지 이해할 수 있습니다. 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