【问题标题】:Is it possible to undefine a class in C++ (Visual Studio)?是否可以在 C++ (Visual Studio) 中取消定义一个类?
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    试试这个:

    namespace your_name_space 
    {
        #include <tinyxml2.h>
    }
    

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

    还必须为 tinyxml2.cpp 文件声明名称规范。

    【讨论】:

    • 请注意,只有当 tinyxml 是一个纯 C 接口,和/或不包含任何新文件,和/或只是开头的标题时,这才有可能正常工作。我已经用 libcurl 完成了这个,例如但如果它不在标题中使用extern "C",它永远不会起作用。在这方面,这是一个危险的策略。话又说回来,所有的决议最终都会归结为类似的苦差事
    • 你是对的,这取决于tinyxml2.h的内部实现,你建议我删除答案吗?或者这个解决方案可以在其他情况下使用?。
    • 不,我只是为答案提供一些深度。让 OP 决定这是否召集他/她
    • 这似乎没有帮助。我同意,这实际上很奇怪。另外,这个解决方案即使有效,实际上也迫使我重写我的原始代码,而问题本身就在一个小测试文件中。顺便说一句,TinyXML 是完全 C++ 库,而不是 C。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 2016-05-18
    相关资源
    最近更新 更多