单元测试 - 是否可以在C++(Visual Studio)中取消定义类

unit testing - Is it possible to undefine a class in C++ (Visual Studio)?

本文关键字:Studio 取消 定义 Visual 是否 C++ 单元测试      更新时间:2023-10-16

我知道,这可能看起来很奇怪,但我的目标是在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 文件声明名称规范。