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让我怀疑此标头是否包含在其他地方(例如 by ChallengeManager.cpp,这意味着您最终会在某些地方和其他地方_correctAnswers拥有大小,这肯定会解释您的崩溃。5001

(编辑):您的测试是解决方案中的一个单独项目,主要代码在其自己的项目中,还是您的代码全部直接在测试项目中编译?

为了安全起见,请#define在 VS 构建配置中设置您(对于链接到测试的所有项目 - 您需要为此添加测试构建配置,并使用它而不是 Debug/Release 进行测试构建)而不是定义它在代码中,并删除#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 回答