【发布时间】:2016-01-20 16:36:13
【问题描述】:
我正在尝试用 C++ 包装一个 C 库,以使其成为现代、高级和惯用的 C++ 库。我想要做的是使 C 对象完全不透明和/或从 C++ 代码中直接不可用,并用更高级别的替代方案包装/替换它们。
我面临的问题很简单:我只想将 C 标头包含到 C++ 源代码中,以便包含 C++ 标头时也不会包含 C 标头的声明,也就是说,它不会t 污染全局命名空间。
但看起来头文件和源文件的正确分离不允许我这样做。这是我的问题的一个非常愚蠢的版本,cmets 会告诉你其余的:
my_header.h:
typedef enum
{
my_Consts_ALPHA = /* some special value */,
my_Consts_BETA = /* other special value */,
} my_Consts;
typedef struct
{
// members...
} my_Type;
void
my_Type_method(my_Type *const,
my_Enum);
my_header.hpp:
namespace my
{
enum class Consts; // <-- This header is missing the constant values of
// this enum, because its values are defined by
// the C header :(
class Type : public my_Type // <-- The super struct is coming from the
// C header, but I don't want to include
// that header here :(
{
public:
void
method(Consts constant);
};
}
my_source.cpp:
extern "C"
{
#include "my_header.h"
}
#include "my_header.hpp"
namespace my
{
enum class Consts
{
ALPHA = my_Consts_ALPHA,
BETA = my_Consts_BETA,
};
void
Type::method(Consts constant)
{
my_Type_method(static_cast<my_Type *const>(this),
static_cast<my_Consts>(constant));
}
}
所以我的问题是:我在这里遗漏了一些非常明显的东西吗?这甚至有可能实现吗?有什么我不知道的技巧吗?
【问题讨论】:
-
namespace m00 {#include "myheader.h"}(是的,这有点讽刺) -
用the pimpl idiom怎么样?
-
您正试图在 cpp 库的接口中重用 c 库中的类型。只要是这样,您显然无法隐藏这些类型。
-
Pimpl 是个糟糕的主意。扼杀了很多优化。
-
@PeterVaro 我记错了,使用范围枚举,您无法获得基础值,句点。 (顺便说一句:我可以在作用域枚举和仅包含非作用域枚举定义的结构之间找到的唯一成本差异是类型安全方面——我假设你关心的是,struct 的变量 类型通常是一个字节,除了它作为基类包含在另一个类中,在这种情况下the Base Class Optimization comes out to play,但你只会使用枚举的实例化......)
标签: c++ c++11 header namespaces wrapper