我有一个CString指针和与其相比较的TCHAR以下列方式:通过==比较CString和TCHAR?
if(srtTest[i] == _T('\n'))
//do something
其中strTest是一个CString * strTest;
我只是想知道这是否正确,因为它不是TCHAR指针。它编译好。 这段代码很古老,似乎没有人抱怨过它,但让我怀疑。
我有一个CString指针和与其相比较的TCHAR以下列方式:通过==比较CString和TCHAR?
if(srtTest[i] == _T('\n'))
//do something
其中strTest是一个CString * strTest;
我只是想知道这是否正确,因为它不是TCHAR指针。它编译好。 这段代码很古老,似乎没有人抱怨过它,但让我怀疑。
是的,没关系(假设strTest
是一个有效的指针,i
是一个有效的索引)。由于strTest
是CString*
,strTest[i]
是CString
。并且有一个免费的operator==
过载,接受const CString&
作为参数1和LPCTSTR
作为参数2,然后做你所期望的。
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
过载operator==
的调用中使用。
The MSDN documentation对CString操作符是旧的。很古老。他们确实为LPCTSTR
提供operator==
,但它被定义为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)
。
谢谢你的回复,我想我已经理清了我的脑海吧! – 10100111001 2014-09-11 06:47:13
这些是单引号围绕文字,而不是双引号,所以它是一个'TCHAR'而不是'LPCTSTR'。 – 2014-09-10 15:14:48
@MarkRansom True。我不确定这是否是一个错字,但我会更新答案。 – dlf 2014-09-10 15:19:23
感谢您的回复!是的,在真实的代码中有单引号。我只是有点困惑,现在它似乎已经清理了! :) – 10100111001 2014-09-11 06:46:00