gpt4 book ai didi

C++ 命名空间冲突

转载 作者:行者123 更新时间:2023-11-27 23:58:49 25 4
gpt4 key购买 nike

我正在 prj_cpp.h 中开发一个 C++ 项目,开始为

// prj_cpp.h
#include "lib_cpp.h"
extern "C" {
#include "lib_c.h"
}

其中lib_cpp.hlib_c.h分别是外部C++和C库的头文件。

外部 C++ 库 lib_cpp.h 也通过以下方式使用 lib_c

// lib_cpp.h
namespace SOME_WEIRD_NAMESPACE {
extern "C" {
#include "lib_c.h"
}
}

因为 lib_c.h 防止了双重包含,结果是 lib_c.h 中的所有对象都驻留在与 SOME_WEIRD_NAMESPACE 无关的地方与我的项目 prj_cpp

另一方面,如果我的头文件看起来像

// prj_cpp.h
extern "C" {
#include "lib_c.h"
}
#include "lib_cpp.h"

我破坏了外部 C++ 项目,因为 SOME_WEIRD_NAMESPACE 下没有任何内容,因为我首先包含了 lib_c.h

我不允许修改 lib_cpp.hlib_c.h

我可以在我的 prj_cpp.h 中做些什么来解决这样的问题吗?

我不太喜欢在我的项目中使用 SOME_WEIRD_NAMESPACE,因为该命名空间与它无关。此外,lib_c.h 头文件的数量可能很大。

最佳答案

由于 lib_cpp.h 和 lib_c.h 来自第三方,并且这些库的新版本可能会提供这些文件的新版本,如果您不更改它们,它将避免将来出现维护问题。您还声明您的规范是您不更改它们。所以包装它们并在您的代码中专门使用包装器来解决问题。

我想到的第一种方法是:

//wrapped_lib_c.h
#ifndef WRAPPED_LIB_C_INC_GUARD
#define WRAPPED_LIB_C_INC_GUARD

namespace SOME_WEIRD_NAMESPACE
{
extern "C"
{
#include "lib_c.h"
}
}

namespace SOME_PROJECT_APPROPRIATE_NAMESPACE
{
using SOME_WEIRD_NAMESPACE;
}

#endif

//wrapped_lib_cpp.h 
#ifndef WRAPPED_LIB_CPP_INC_GUARD
#define WRAPPED_LIB_CPP_INC_GUARD

#include "lib_cpp.h"

namespace SOME_PROJECT_APPROPRIATE_NAMESPACE
{
using SOME_WEIRD_NAMESPACE;
}
#endif

这种方法的一些变体应该适用于您的情况,并且您需要维护的详细信息隔离在包装文件中。

关于C++ 命名空间冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40661863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com