【问题标题】:Comparing CString to TCHAR by ==?通过 == 将 CString 与 TCHAR 进行比较?
【发布时间】:2014-09-10 14:49:08
【问题描述】:

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

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

其中 strTest 是 CString* strTest;

我只是想知道这是否正确,考虑到它不是 TCHAR 指针。它编译正常。 这段代码很老了,似乎没有人抱怨过,不过让我很奇怪。

【问题讨论】:

    标签: c++ string mfc string-comparison tchar


    【解决方案1】:

    是的,没关系(假设strTest 是一个有效的指针,i 是一个有效的索引)。因为strTestCString*,所以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') 隐式构造,然后用于对 operator==CString/CString 重载的调用。

    【讨论】:

    • 这些是文字周围的单引号,而不是双引号,所以它是 TCHAR 而不是 LPCTSTR
    • @MarkRansom 真的。我不确定这是否是错字,但我会更新答案。
    • 感谢您的回复!是的,在真正的代码中有单引号。我只是有点困惑,现在它似乎已经清除了! :)
    【解决方案2】:

    CString 运算符上的The MSDN documentation 已过时。很古老。他们确实为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)

    【讨论】:

    • 也感谢您的回复,我想我现在明白了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多