2009-12-02 3 views
1

(마이크로 소프트의 또는 Open 재단 수업 일 - http://www.koders.com/cpp/fid035C2F57DD64DBF54840B7C00EA7105DFDAA0EBD.aspx#L77), 다음 코드 니펫 (TCHAR *) (&이 [1])가 표시 무엇CString : (TCHAR *) (this + 1)은 무엇을 의미합니까? CString을 헤더 파일에서

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

가?

CStringData 구조체는 CString 클래스에서 사용됩니다 (http : // www.koders.com/cpp/fid100CC41B9D5E1056ED98FA36228968320362C4C1.aspx).

도움을 주시면 감사하겠습니다.

답변

2

CString은 내부 트릭을 사용하여 전달할 때 일반적인 문자열처럼 보입니다.()의 경우와 같이, 인수 목록에서 LPCTSTR으로 캐스팅하지 않고 실제로는 클래스 -인데도 불구하고, printf 함수로 변환 할 수 있습니다. a printf. 따라서 CString 구현에서 하나의 개별 트릭이나 함수를 이해하려고하면 나쁜 소식입니다. (데이터 함수는 문자열과 관련된 '실제'버퍼를 가져 오는 내부 함수입니다.)

들어가는 MFC Internals와 Blaszczak 책이 만질 수있는 IIRC가 있습니다.

편집 : 표현이 실제로 ++ 원시 C의 측면에서로 변환 무엇인지에 관해서는 : -

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

이 "당신이 실제로 함께 이제 할당 된 항목의 배열의 첫 번째 항목 척 말한다. 두 번째 항목은 실제로는 CString이 아니며 유니 코드 또는 일반 문자 (즉, LPTSTR)의 일반 NUL 종료 버퍼입니다.

같은 일을 표현하는 또 다른 방법은 다음과 같습니다 당신이 T에 대한 포인터에 1을 추가 할 때, 당신은 실제로 원시 메모리 주소의 측면에서 1 개 *의를 sizeof (T)를 추가

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

. 따라서 CString이 sizeof (CString) = 4 인 0x00000010에있는 경우 데이터는 0x00000014부터 시작하는 NUL 종료 문자 배열의 포인터를 반환합니다.

그러나이 상황을 이해하는 것은 반드시 좋은 것은 아닙니다. 생각.

이 필요합니까?

+1

이것은 MFC가 아니라 OFC를 가리 킵니다. – kgiannakakis

+0

@kgiannakakis : 링크가 끊어 졌거나 질문을 던지지 않았습니다. 그러나 그 이유는 동일 할 것 같습니다. –

+0

@ 루벤 : 고마워요. 나는 당신의 답장과 kgiannakakis의 대답을 토대로 그것을 알아 냈다고 생각합니다. (this + 1)은 기본적으로 실제 내용을 찾을 수있는 CString 유형의 오프셋을 가리 킵니다. mem_alloc 문으로 명확 해집니다. 이것은 단지 학습 운동이었습니다. 그러므로 질문. – Vino

1

CStringData 구조 바로 다음의 메모리 영역을 TCHAR 문자의 배열로 반환합니다.

당신은 당신이 CString.cpp 파일을 보면 그들이이 일을하는 이유를 이해할 수있다 : 당신이 GetData의 요청 때 그들은이 트릭을 할

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

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

@kgiannakakis : Didnt는 reimpl처럼 보인다. MFC의 CString의, 그래서 그들이 왜 그것을했는지 (명시 적 캐스트없이 printf에서 CString을'...'에 전달할 수 있도록) 이유가있다. –

+0

Okie, mem_alloc 문으로 명확하게 나타납니다. 감사. – Vino

0

CString을가 정상적인 데이터 버퍼처럼 보이도록, 그리고 CStringData 구조를 건너 뛰고 char 같은 실제 데이터 버퍼를 직접 가리 킵니다. *

관련 문제