我知道,这可能看起来很奇怪,但我的目标是在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:\程序文件 (x86)\Windows 工具包\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"来解决这个问题。但是,我仍然想知道这个主题问题的答案。
我认为您已经为tinyxml2使用了默认命名空间。尝试删除using namespace tinyxml2
然后像以下示例一样使用它: tinyxml2::XMLDocument xDoc;
试试这个:
namespace your_name_space
{
#include <tinyxml2.h>
}
从现在开始,tinyxml2 中的所有类都被你的命名空间隐藏了。
还必须为 tinyxml2.cpp 文件声明名称规范。