我有一个CString指针,它按以下方式与TCHAR进行比较:
if(srtTest[i] == _T('\n'))
//do something
其中strTest是CString * strTest;
我只是想知道这是否正确,因为它不是TCHAR指针。编译好了。 这段代码非常陈旧,似乎没有人抱怨它,让我想知道。
答案 0 :(得分:4)
是的,没关系(假设strTest
是有效指针而i
是有效索引)。由于strTest
是CString*
,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)
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)
。