我想为C API编写一个c ++包装器。为此,最方便的是在我自己的头文件中包含C-API头文件,但这也包括外部系统文件中的头文件,不应该公开给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不能用于我的自动完成,因此不会意外使用。
答案 0 :(得分:3)
在项目命名空间中定义名称空间detail
,并在那里包含C标题。
如果C头没有定义en extern "C"
- 阻止从C ++中包含,请执行以下操作之一:
extern "C"
块进行换行,并验证C头是否包含有效且等效的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;
}
使用FOO
选择性地将您需要的符号添加到using
- 命名空间。
BTW:您的转发器功能应该是inline
!
答案 1 :(得分:-1)
你应该能够使用
安排事情#ifdef __cplusplus
/* C++ code here, including #include*/
#else
/*C code*/
#endif