1

この質問は他の質問と重複している可能性があることは承知していますが、この変更を行う前に自分が正しいことを確認したいので、とにかくここで質問します。私が維持している古いプロジェクトには、次のコード行があります。

TCHAR m_sLogPath[MAX_LOGPATH_LEN];

配列が初期化されて使用されるコード行がありますが、しばらくすると次のチェックが行われます。

if(NULL== m_sLogPath || _tcsicmp(m_sLogPath, trace_path)!=0){//code here}

これは if ステートメントが m_sLogPath が空かどうかをチェックしていると思いますが、配列を NULL と比較しても意味がないので、NULL== m_sLogPath は無意味なチェックです。NULL== m_sLogPath peice を削除する必要があります。私の質問は、配列が空であることを確認する代わりに何をすべきかということです。すべての回答とヘルプに感謝します。

4

2 に答える 2

8

そうです、同じコンテキストで行われた場合、それは無意味なチェックです。

関数にパラメーターとして渡すと、配列はポインターに崩壊し、それほど無意味ではありません。

配列が空であることを確認するために代わりに何をすべきか

配列が空になることはありません。常にMAX_LOGPATH_LEN TCHARs が含まれます。しかし、次の方法でうまくいく可能性があります。

if( m_sLogPath[0] == _T('\0') || _tcsicmp(m_sLogPath, trace_path)!=0)
于 2012-04-04T11:03:17.747 に答える
3

m_sLogPath配列には常に文字が含まれますMAX_LOGPATH_LENMAX_LOGPATH_LENそれが 0 より大きい定数であると仮定すると、配列が実際に空になることはありません。

本当にチェックしたいのは、この配列に格納されている C スタイルの文字列が空かどうかだと思います。その場合、最も簡単な方法は次のとおりです。

#include <tchar.h>
#include <windows.h>

const size_t MAX_LOGPATH_LEN = MAX_PATH;
TCHAR m_sLogPath[MAX_LOGPATH_LEN];

int main()
{
    if (m_sLogPath[0] == _T('\0'))
    {
        // m_sLogPath contains empty string.
    }
}
于 2012-04-04T11:06:55.233 に答える