gpt4 book ai didi

c++ - 如何不使用 C 头文件的声明污染全局 namespace ?

转载 作者:可可西里 更新时间:2023-11-01 18:36:46 28 4
gpt4 key购买 nike

我正在尝试用 C++ 包装一个 C 库,使其成为一个现代的、高级的和惯用的 C++ 库。我想做的是使 C 对象完全不透明和/或直接从 C++ 代码中不可用,并用更高级别的替代品包装/替换它们。

我面临的问题很简单:我只想将 C 头文件包含到 C++ 源代码中,这样 C++ 头文件在包含时就不会包含 C 头文件的声明,也就是说,它不会' t 污染全局命名空间。

但是头文件和源文件的正确分离似乎不允许我这样做。这是我的问题的一个非常虚拟的版本,评论会告诉你剩下的:


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));
}
}

所以我的问题是:我是否遗漏了一些非常明显的东西?这甚至有可能实现吗?有没有我不知道的技巧?

最佳答案

在问题的评论中@AnalPhabet讽刺地建议,应该在 namespace 中使用 C header 的 #include@n.m.确认,它实际上是一个可行的解决方案,现在我在自己的设置上对其进行了测试,幸运的是它运行良好。

(虽然我不知道这是否是特定于实现的,但我在 g++clang++ 上都进行了测试并且它正在运行。)

它没有解决不透明问题,但至少它使更难直接访问原始 C 数据,因为它位于单独的 namespace 现在,因此用户不能意外访问,而是自愿访问。

因此,my_header.hpp 应该如下所示:

namespace my
{
extern "C"
{
#include "my_header.h"
}

enum class Consts
{
ALPHA = my_Consts_ALPHA,
BETA = my_Consts_BETA,
};

class Type : public my_Type
{
public:
void
method(Consts constant);
};
}

因此,无论 my_header.hpp#include 的什么地方,用户都只能按如下方式访问 C 值:

my::my_Consts_ALPHA       // The wrapped value is => my::Consts::ALPHA
my::my_Type // The wrapped value is => my::Type
my::my_Type_method(t,..) // The wrapped value is => t.method(..)

关于c++ - 如何不使用 C 头文件的声明污染全局 namespace ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33263405/

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