将头文件包含在头文件中,而不将其内容暴露给包含者

时间:2014-07-31 14:52:29

标签: c++ header wrapper

我想为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不能用于我的自动完成,因此不会意外使用。

2 个答案:

答案 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