【发布时间】:2014-04-05 20:59:57
【问题描述】:
我知道,这可能看起来很奇怪,但我的目标是在 C++ 中取消定义一个类。问题的根源在于结合 TinyXML2 和 Boost 单元测试。
正在测试的头文件(Configuration.h)的内容:
...
#include <tinyxml2.h>
...
这是我的 configurationTests.h 文件的内容:
#include "unitTests.h"
#include "Configuration.h"
BOOST_AUTO_TEST_SUITE(configuration_test)
BOOST_AUTO_TEST_CASE(basic) {
...
}
BOOST_AUTO_TEST_SUITE_END( )
当我尝试编译我的测试时,我收到了一个错误:
错误 C2371:“XMLDocument”:重新定义;不同的基础 类型 c:\program files (x86)\windows kits\8.0\include\um\msxml.h 10085
在这个文件 (msxml.h) 的第 10085 行,我们有这个类定义:
class DECLSPEC_UUID("CFC399AF-D876-11d0-9C10-00C04FC99C8E")
XMLDocument;
当我删除这两行时,我的测试会编译并且一切看起来都很好。当然,这不是一个解决方案,但这一事实证明 Boost 单元测试库中的某些内容包含 msxml.h 并以某种方式导致与 TinyXML2 库发生冲突。
我尝试了在 Google 中找到的不同解决方案(例如编写“#define WIN32_LEAN_AND_MEAN”),删除“使用命名空间 tinyxml2”并在 tinyxml2.cpp 中进行更改 - 没有任何实际帮助。
所以,我的问题很简单:我可以在编译时以某种棘手的方式取消定义(卸载?)之前定义的类吗?我试过“#undef XMLDocument”、“#define XMLDocument 1”+“#undef XMLDocument”——没有任何效果。
更新:实际上,我通过在 configurationTests.h 的第一行写“#define MSXML_LIBRARY_DEFINED”解决了这个问题。但是,我仍然很想知道这个主题问题的答案。
【问题讨论】:
-
我可能遇到了类似的问题。我开始使用 Boost.Test,而我在运行 Boost.Test 项目时看到的测试来自 TinyXML 的
xmltest.cpp,这确实令人困惑。你知道为什么 Boost.Test 会找到 TinyXML 的测试吗?
标签: c++ unit-testing visual-studio-2012 boost tinyxml