我认为这是儿童问题,但我找不到如何解决它的信息。
// * 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;
}
}
}
在我看来,我在docs中都喜欢这样,但是当用#define RedefChallangesCount行运行测试时,我得到了一些奇怪的错误,例如“访问冲突读取位置”,有时候数组不好 _正确答案。与此同时,我发现ChallangesCount是预期的500。如果我评论#define RedefChallangesCount行 - 所有错误都消失了...... 什么可能是错的?
答案 0 :(得分:4)
您的#undef
让我怀疑此标题是否包含在其他位置(例如ChallengeManager.cpp
,这意味着您的_correctAnswers
大小为500
在某些地方和1
在其他地方,这肯定会解释你的崩溃。
(编辑):您的测试是否是解决方案中的单独项目,主代码位于自己的项目中,或者您的代码是否直接在测试项目中编译?
为了安全起见,在VS构建配置中设置#define
(对于链接到测试的所有项目 - 您需要为此添加测试构建配置,并使用它而不是调试/发布对于测试版本而不是在代码中定义它,并删除#undef
答案 1 :(得分: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
但是,让我知道是否需要使用预处理器,然后我可以尝试使用该方法为您排序解决方案,尽管如我所说,我不使用预处理程序指令来实际程序流程(必须添加< em>通常,保证我已经做了一次因为有效的原因,并且无法记住)。