我有一个 CString 指针,它通过以下方式与 TCHAR 进行比较:
if(srtTest[i] == _T('\n'))
//do something
其中 strTest 是 CString* strTest;
我只是想知道这是否正确,考虑到它不是 TCHAR 指针。它编译正常。这段代码很旧,似乎没有人抱怨过,但让我感到奇怪。
我有一个 CString 指针,它通过以下方式与 TCHAR 进行比较:
if(srtTest[i] == _T('\n'))
//do something
其中 strTest 是 CString* strTest;
我只是想知道这是否正确,考虑到它不是 TCHAR 指针。它编译正常。这段代码很旧,似乎没有人抱怨过,但让我感到奇怪。
是的,没关系(假设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')
然后用于调用.CString
CString
operator==
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)
你正在使用的。