C++ 通过==?将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。还有一个免费的操作符

我有一个CString指针,它通过以下方式与TCHAR进行比较:

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。我不确定这是否是打字错误,但我会更新答案。谢谢你的回复!是的,在真实代码中有单引号。我只是有点困惑,但现在似乎已经清楚了!:)也谢谢你的回复,我想我现在已经把它弄清楚了!也谢谢你的回复,我想我现在已经把它弄清楚了!