C++ 通过==?将CString与TCHAR进行比较?
我有一个CString指针,它通过以下方式与TCHAR进行比较:C++ 通过==?将CString与TCHAR进行比较?,c++,string,mfc,string-comparison,tchar,C++,String,Mfc,String Comparison,Tchar,我有一个CString指针,它通过以下方式与TCHAR进行比较: if(srtTest[i] == _T('\n')) //do something 其中strTest是CString*strTest 我只是想知道这是否正确,因为它不是TCHAR指针。它编译得很好。 这段代码非常古老,似乎没有人抱怨过,这让我怀疑。是的,它没问题(假设strTest是一个有效的指针,i是一个有效的索引)。由于strTest是一个CString*,strTest[i]是一个CString。还有一个免费的操作符
if(srtTest[i] == _T('\n'))
//do something
其中strTest是CString*strTest
我只是想知道这是否正确,因为它不是TCHAR指针。它编译得很好。
这段代码非常古老,似乎没有人抱怨过,这让我怀疑。是的,它没问题(假设strTest
是一个有效的指针,i
是一个有效的索引)。由于strTest
是一个CString*
,strTest[i]
是一个CString
。还有一个免费的操作符==
重载,它接受一个常量CString&
作为param1,接受一个LPCTSTR
作为param2,然后执行您期望的操作
MSDN文档是。第二个过载很重要:
BOOL operator ==( const CString& s1, LPCTSTR s2 );
(文档已过期,当我追踪到实际代码时看到的签名不同,但效果相同)
MarkRansom提醒我,您的代码将strTest[i]与字符而不是字符串进行比较。这仍然可以,因为还有一个操作符==
重载,它接受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
操作符==的重载中使用。是的,没问题(假设strTest
是有效指针,i
是有效索引)。由于strTest
是CString*
,strTest[i]
是一个CString
。还有一个免费的操作符==
重载,它接受一个const CString&
作为param1,接受一个LPCTSTR
作为param2,然后执行您期望的操作
MSDN文档是。第二个重载很重要:
BOOL operator ==( const CString& s1, LPCTSTR s2 );
(文档已过期,当我追踪到实际代码时看到的签名不同,但效果相同)
Markransem提醒我您的代码与strTest[i]进行比较转换为字符而不是字符串。这仍然可以,因为还有一个操作符==
重载,它接受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
将从\u T('\n')隐式构造
然后用于调用CString
/CString
CString操作符上的操作符==
重载是旧的。非常旧。它们确实为LPCTSTR
提供操作符==
,但这被定义为常量TCHAR*
是一个TCHAR
,而不是TCHAR*
,所以这些都不适用。但它似乎可以工作
在cstringt.h中,我看到(我使用的是VS2010):
简单解释了什么是XCHAR
。基本上是TCHAR
。因此这里大概是bool运算符==(const CString&,TCHAR ch)
您正在使用。对CString运算符很旧。非常旧。它们确实为LPCTSTR
提供了运算符==
,但这被定义为常量TCHAR*
\T('\n')
是TCHAR
,而不是TCHAR*
,因此这些都不适用。但它似乎是有效的
在cstringt.h中,我看到(我使用的是VS2010):
简单解释了什么是
XCHAR
。基本上是TCHAR
。因此这里大概是bool运算符==(const CString&,TCHAR ch)
您正在使用。这些是围绕文字的单引号,而不是双引号,因此它是TCHAR
而不是LPCTSTR
@MarkRansom True。我不确定这是否是打字错误,但我会更新答案。感谢您的回复!是的,在真正的代码中有单引号。我只是有点困惑,但现在它似乎有点奇怪我已经澄清了!:)这些是围绕文字的单引号,而不是双引号,因此它是TCHAR
而不是LPCTSTR
@MarkRansom True。我不确定这是否是打字错误,但我会更新答案。谢谢你的回复!是的,在真实代码中有单引号。我只是有点困惑,但现在似乎已经清楚了!:)也谢谢你的回复,我想我现在已经把它弄清楚了!也谢谢你的回复,我想我现在已经把它弄清楚了!