2014-09-10 38 views
1

我有一个CString指针和与其相比较的TCHAR以下列方式:通过==比较CString和TCHAR?

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

其中strTest是一个CString * strTest;

我只是想知道这是否正确,因为它不是TCHAR指针。它编译好。 这段代码很古老,似乎没有人抱怨过它,但让我怀疑。

回答

4

是的,没关系(假设strTest是一个有效的指针,i是一个有效的索引)。由于strTestCString*,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==的调用中使用。

+2

这些是单引号围绕文字,而不是双引号,所以它是一个'TCHAR'而不是'LPCTSTR'。 – 2014-09-10 15:14:48

+0

@MarkRansom True。我不确定这是否是一个错字,但我会更新答案。 – dlf 2014-09-10 15:19:23

+0

感谢您的回复!是的,在真实的代码中有单引号。我只是有点困惑,现在它似乎已经清理了! :) – 10100111001 2014-09-11 06:46:00

2

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)

+0

谢谢你的回复,我想我已经理清了我的脑海吧! – 10100111001 2014-09-11 06:47:13