是否可以在C ++(Visual Studio)中取消定义类?

时间:2014-04-05 20:59:57

标签: c++ unit-testing visual-studio-2012 boost tinyxml

我知道,这看起来很奇怪,但我的目标是在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

在第10085行的这个文件(msxml.h)中,我们有这个类定义:

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 ”来解决问题。但是,我仍然想知道这个主题问题的答案。

2 个答案:

答案 0 :(得分:0)

试试这个:

namespace your_name_space 
{
    #include <tinyxml2.h>
}

从现在起,tinyxml2中的所有类都被命名空间隐藏了。

必须为tinyxml2.cpp文件声明namespece。

答案 1 :(得分:0)

我认为你已经为tinyxml2使用了默认命名空间。 尝试删除using namespace tinyxml2,然后像在此示例中一样使用它: tinyxml2::XMLDocument xDoc;