通过==比较CString和TCHAR?

时间:2014-09-10 14:49:08

标签: c++ string mfc string-comparison tchar

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

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

其中strTest是CString * strTest;

我只是想知道这是否正确,因为它不是TCHAR指针。编译好了。 这段代码非常陈旧,似乎没有人抱怨它,让我想知道。

2 个答案:

答案 0 :(得分:4)

是的,没关系(假设strTest是有效指针而i是有效索引)。由于strTestCString*strTest[i]CString。并且有一个免费的operator==重载,它接受const CString&作为param1和LPCTSTR作为param2,然后执行您期望的行为。

MSDN文档为here。第二个重载是重要的:

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 ++版本中,CString将隐式构造自_T('\n'),然后用于调用CString / CString重载operator== 1}}。

答案 1 :(得分:2)

CString运算符上的

The MSDN documentation已经过时了。很古老。他们确实为operator==提供LPCTSTR,但这被定义为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 article简单解释XCHAR是什么。基本上是TCHAR。所以,大概是你正在使用的bool operator==(const CString&, TCHAR ch)