1

我有一个 CString 指针,它通过以下方式与 TCHAR 进行比较:

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

其中 strTest 是 CString* strTest;

我只是想知道这是否正确,考虑到它不是 TCHAR 指针。它编译正常。这段代码很旧,似乎没有人抱怨过,但让我感到奇怪。

4

2 回答 2

4

是的,没关系(假设strTest是一个有效的指针并且i是一个有效的索引)。既然strTest是一个CString*strTest[i]就是一个CString。还有一个免费的operator==重载,它接受 aconst CString&作为 param1 和 aLPCTSTR作为 param2,然后执行您所期望的操作。

MSDN 文档在这里。第二个重载是最重要的:

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

(文档已经过时,我在追溯实际代码时看到的签名不同,但效果是一样的)

MarkRansom 提醒我,您的代码比较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++ 版本中, aCString将被隐式构造,_T('\n')然后用于调用.CStringCStringoperator==

于 2014-09-10T14:57:39.880 回答
2

CString 运算符的 MSDN 文档很旧。很古老。他们确实提供operator==LPCTSTR,但那被定义为const TCHAR*_T('\n')是 a TCHAR,而不是 aTCHAR*所以这些都不适用。然而它似乎工作......

在 cstringt.h 中,我看到(我使用的是 VS 2010):

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

这篇文章简单地解释了 anXCHAR是什么。基本上一个TCHAR. 所以这里,大概是bool operator==(const CString&, TCHAR ch)你正在使用的。

于 2014-09-10T15:24:26.347 回答