0

これは子供の質問だと思いますが、解決方法に関する情報が見つかりません。

//*.h:

class Foo
{
    #if defined(RedefChallangesCount)
        static const mainDataType ChallangesCount = 500;
        #undef RedefChallangesCount
    #else
        static const mainDataType ChallangesCount = 1;
    #endif

    ...
    int _correctAnswers[ChallangesCount];

    ....
}

私のVSテストクラスでは:

#include "stdafx.h"
#include "CppUnitTest.h"
#define RedefChallangesCount
#include "..\Core\ChallengeManager.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;
using namespace Brans;

namespace CoreTests
{
    TEST_CLASS(SomeTestClass)
    {
    public:
        TEST_METHOD(SomeTestMethod)
        {
            Foo* cm = new Foo();
            cm->Method();
            ...
            delete cm;
        }
    }
}

私はドキュメントのようにすべてのように思えますが、#define RedefChallangesCount 行でテストを実行すると、「アクセス違反の読み取り場所」などの奇妙なエラーが発生し、配列 _correctAnswers が正しくない場合があります。同時に、ChallangesCount が予想どおり 500 であることがわかります。#define RedefChallangesCount 行にコメントすると、すべてのエラーがなくなりました...何が問題なのですか?

4

2 に答える 2

4

あなた#undefは、このヘッダーが他の場所に含まれているのではないかと疑っています (たとえば、によって、いくつかの場所や他の場所で のサイズになることをChallengeManager.cpp意味します。これは確かにあなたのクラッシュを説明するでしょう._correctAnswers5001

(編集):テストはソリューション内の別のプロジェクトであり、メイン コードは独自のプロジェクトにありますか?それとも、コードはすべてテスト プロジェクトで直接コンパイルされていますか?

安全のために#define、定義するのではなく、VS ビルド構成で設定します (テストにリンクされているすべてのプロジェクトについて、これにはテスト ビルド構成を追加し、テスト ビルドのデバッグ/リリースの代わりにそれを使用する必要があります)。コードでそれを削除し、#undef

于 2013-11-05T10:13:30.613 に答える
1

if defined私は、コード、特にクラス コード内にセクションを持たない傾向があります。私は変数を使用する傾向があり、その値に基づいて分岐します。

テストクラスで を削除#define RedefChallangesCountし、グローバル変数に置き換えますbool RedefChallangesCount

その後、コードははるかに単純になり、次のようになります (デモンストレーション用の単純化されたバージョン)。

#include <iostream>

using namespace std;
bool RedefChallangesCount = false;
int main()
{
    int ChallangesCount;
    cout << RedefChallangesCount << endl;
    if (RedefChallangesCount)
        ChallangesCount = 500;
    else
        ChallangesCount = 1;

   cout << ChallangesCount << endl; 

   return 0;
}

とは対照的に:

#if defined(RedefChallangesCount)
    static const mainDataType ChallangesCount = 500;
    #undef RedefChallangesCount
#else
    static const mainDataType ChallangesCount = 1;
#endif

ただし、プリプロセッサを使用することが要件であるかどうかを教えてください。その後、その方法論を使用して解決策を試してみることができますが、私が言ったように、実際のプログラム フローにはプリプロセッサ ディレクティブを使用しません (保証されているように、通常は追加する必要があります)。正当な理由で一度やったことがありますが、覚えていません)。

于 2013-11-05T10:47:42.327 に答える