1

I have a CString pointer and it is being compared to a TCHAR in the following way:

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

where strTest is a CString* strTest;

I just wonder if this is correct, considering it is not a TCHAR-pointer. It compiles ok. This code is very old and no one seems to have complained about it, makes me wonder though.

4

2 に答える 2

4

はい、大丈夫です (strTestが有効なポインターでiあり、有効なインデックスであると仮定します)。strTestは であるため、CString*strTest[i]ですCString。また、 as param1 とas param2operator==を受け取り、期待どおりの動作をする無料のオーバーロードがあります。const CString&LPCTSTR

MSDN のドキュメントはこちらです。2 番目のオーバーロードが重要です。

BOOL operator ==( const CString& s1, LPCTSTR s2 );

(ドキュメントは古く、実際のコードをたどったときに表示される署名は異なりますが、効果は同じです)

MarkRansom は、コードstrTest[i]が文字列ではなく文字と比較されるという事実を警告してくれました。/operator==を取るオーバーロードもあるので、それでも問題ありません。リンク先のドキュメントには記載されていませんが、VS2012 バージョンでの実際のコードは次のようになります。CStringchar

friend bool operator==(
        _In_ const CStringT& str1,
        _In_ XCHAR ch2) throw()
    {
        return( (str1.GetLength() == 1) && (str1[0] == ch2) );
    }

古いドキュメントには記載されていないため、この関数はおそらく常に存在していたわけではありません。ただし、CStringを受け取る暗黙のコンストラクターがありTCHARます。上記よりも前の VC++ バージョンでは、 aCStringが暗黙的に構築され、 の/オーバーロード_T('\n')への呼び出しで使用されると想定しています。CStringCStringoperator==

于 2014-09-10T14:57:39.880 に答える
2

CString 演算子に関するMSDN ドキュメントは古いものです。非常に古い。彼らは を提供しますoperator==LPCTSTR、それは として定義されてい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) );
}

この記事では、an とは何かを簡単に説明しますXCHAR。基本的にTCHAR. したがって、おそらく、bool operator==(const CString&, TCHAR ch)あなたが使用しているのは です。

于 2014-09-10T15:24:26.347 に答える