gpt4 book ai didi

c++ - 将头文件包含到头文件中而不将其内容暴露给包含程序

转载 作者:行者123 更新时间:2023-11-30 04:02:28 25 4
gpt4 key购买 nike

我想为 C API 编写一个 C++ 包装器。为此,将 C-API header 包含在我自己的 header 中是最方便的,但这也将 header 包含在外部系统的文件中,不应向 C-API 公开。

capi.h

enum MyFlags {
MY_FLAG_A,
MY_FLAG_B,
};

void FOO_bar(int flags);

cppapi.hh

#include "capi.h"

enum class MyFlags {
A = MY_FLAG_A,
B = MY_FLAG_B
};

namespace foo {
void bar(MyFlags flags) {
FOO_bar((int)flags);
}
}

只是将c的命名约定翻译成c++的语言特性。因此,当使用该语言的 C++ 变体时,我希望 c_api 不可用于我的自动完成,因此不会意外使用。

最佳答案

在您的项目命名空间中定义一个命名空间 detail,并在其中包含 C header 。

如果 C header 未定义 en extern "C"- 从 C++ 包含时阻止,请执行以下操作之一:

  • 用外部 extern "C" block 包装并验证 C header (如果包含在内)是有效且等效的 C++。 (特别注意枚举大小和内联函数)。
  • 使用 #ifdef __cplusplus 使其有效且等效于 C++。

因此,所有这些 C 函数都隐藏在内部实现细节命名空间中,不会打扰任何人。

namespace foo {
namespace internal {
extern "C" {
#include "capi.h"
}
}
// Function alias
using bar = internal::FOO_bar;
// Type alias
using config_t = internal::FOO_config;
}

使用 using 有选择地将您需要的那些符号放入 FOO 命名空间。

顺便说一句:您的转发器函数应该是内联!

关于c++ - 将头文件包含到头文件中而不将其内容暴露给包含程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25062122/

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