2014-09-10 9 views
1

나는 CString을 포인터를 가지고 있고 그것은 다음과 같은 방법으로 TCHAR와 비교되고있다 :CString과 TCHAR를 == 비교 하시겠습니까?

if(srtTest[i] == _T('\n')) 
    //do something 

strTest는 CString을 * strTest이다;

TCHAR 포인터가 아니라고 생각하면 이것이 올바른지 궁금 할 것입니다. 그것은 ok를 컴파일합니다. 이 코드는 매우 오래되었고 아무도 그것에 대해 불평하지 않는 것 같습니다.

답변

4

예, 괜찮습니다. strTest이 유효한 포인터이고 i이 유효한 색인이라고 가정합니다. strTestCString*이므로 strTest[i]CString입니다. 그리고 무료 operator== 과부하는 const CString&을 param1로, LPCTSTR을 param2로 받아들이고 예상 한대로 수행합니다.

MSDN 설명서는 here입니다.

MarkRansom

BOOL operator ==(const CString& s1, LPCTSTR s2); 

(문서가 오래되어 나는 실제 코드로 추적 할 때 내가 보는 서명이 다르지만 효과는 동일) : 두 번째 오버로드는 중요한 하나입니다 귀하의 코드가 strTest[i]을 문자열이 아닌 문자로 비교한다는 사실을 알려 주셨습니다. 여전히 operator== 과부하가 걸려서 CString/char이 걸리기 때문에 여전히 괜찮습니다. 내가에 링크 된 문서에 나와 있지만, 여기에 실제 코드는 VS2012 버전의 모습입니다 아니에요 :

가 오래된 문서에 나열되지 않은 이후로
friend bool operator==(
     _In_ const CStringT& str1, 
     _In_ XCHAR ch2) throw() 
    { 
     return((str1.GetLength() == 1) && (str1[0] == ch2)); 
    } 

,이 기능이 아마도 항상 존재하지 않았다. 그러나 CString에는 TCHAR을 사용하는 암시 적 생성자가 있습니다. 위의 것보다 앞선 VC++ 버전에서 CString은 암시 적으로 _T('\n')에서 생성 된 다음 CString/CString 과부하 operator==에 대한 호출에 사용 된 것으로 가정합니다.

+2

이것은 큰 따옴표가 아닌 리터럴 주위의 작은 따옴표이므로 'TCHAR'이며 'LPCTSTR'이 아닙니다. –

+0

@MarkRansom True. 오타가 아닌지 확실하지 않지만 대답을 업데이트 할 것입니다. – dlf

+0

답장을 보내 주셔서 감사합니다! 예, 실제 코드에는 작은 따옴표가 있습니다. 나는 조금 혼란스러워했다. 이제는 정리 된 것 같다. :) – 10100111001

2

The MSDN documentation (CString 연산자 사용) 아주 오래된. 그들은 LPCTSTR에 대해 operator==을 제공하지만 이는 const TCHAR*으로 정의됩니다. _T('\n')TCHAR이 아니며 TCHAR*이 아니므로 해당 사항이 적용되지 않습니다. 그러나 ... cstringt.h에서

, 내가 볼 (내가 VS 2010 사용하고 있습니다) 작동하는 것 같다 :

friend bool operator==(
    _In_ const CStringT& str1, 
    _In_ XCHAR ch2) throw() 
{ 
    return((str1.GetLength() == 1) && (str1[0] == ch2)); 
} 

This articleXCHAR이 무엇인지 간단하게 설명합니다. 기본적으로 TCHAR입니다. 그래서 여기 아마도 bool operator==(const CString&, TCHAR ch)이 사용 중입니다.

+0

답장을 보내 주셔서 감사합니다, 나는 그것을 지금 내 머리 속에서 곧게 만들었다 고 생각합니다! – 10100111001