在c++头文件中声明一个C类型定义
forward declare a C typedef in a C++ header
我为一个C API编写了一个c++包装器类。
我的包装器类有一个私有实例成员,该成员是原始API中使用的类型定义结构。我不想修改API头文件,但我也想隐藏原始API的所有痕迹,所以我不想在包装器类的头文件中包含原始API头文件。
我可能忽略了一些非常简单的东西,但我没有找到它。PIMPL是一种选择,但我更愿意在为一件小事重构整个代码库之前寻找替代方案。
wrapper.hpp
class myWrapper
{
public:
myWrapper();
private:
originalTypedef *original; // forward declaration needed for originalTypedef
};
wrapper.cpp
#include "wrapper.hpp"
#include "originalAPI.h"
myWrapper::myWrapper()
{
original = originalAPI_get();
}
Main.cpp
#include "wrapper.hpp"
int main()
{
myWrapper wrapper = new myWrapper();
}
我能快速想到的选项:
-
您可以在myWrapper.h中重复C API中的
typedef
。typedef struct the_original_struct_type originalTypedef;
-
在调用C API之前,可以使用
void*
作为myWrapper
和reinterpret_cast
到originalTypedef*
的成员变量。class myWrapper { private: void* original; };
一个奇特的解决方案是编写一个代码生成器,它读取original_c_api.h,并输出一个文件original_c_api_types.h,该文件只包括结构定义、类型等,但不包括任何函数,以及一个包含函数声明的文件original_c_api_functions.h。然后wrapper.h包括original_c_api_types.h, wrapper.cpp包括wrapper.h和original_c_api_functions.h。代码生成器应该在make文件中作为目标运行。
当然,如果你有权修改原始的C api文件,这是最简单的解决方案。
您正在寻找的是类似于pImpl模式的东西-您提供了一个c++ API,并且实现与客户端混淆:
头文件// forward declare obfuscated implementation
// we can do this because we're only using a ptr
class Implementation;
class Wrapper
{
public:
Wrapper();
~Wrapper();
void doSomething();
private:
Implementation * pImpl;
};
. cpp文件 #include "originalAPI.h"
class Implementation
{
public:
void doSomething()
{
OriginalAPI_DoSomething();
}
};
Wrapper::Wrapper()
{
this->pImpl = new Implementation();
}
Wrapper::~Wrapper()
{
delete pImpl;
}
void Wrapper::doSomething()
{
pImpl->doSomething;
}
相关文章:
- 此代码是否违反一个定义规则
- 静态结构和一个定义规则
- 为什么转换函数声明不需要至少一个定义类型说明符
- 只有一个定义/声明时标头声明变量的多堆定义错误
- 一个定义规则 - 编译
- 为什么传递给函数 set::itrator 而不是 const_iterator 违反了一个定义规则?
- 内联函数和一个定义规则
- 如何在C 中应用ODR(一个定义规则)
- C++ 多个定义,即使只给出了一个定义
- std::integral_constant<T, v>::value 总是有一个定义吗?
- 为什么这不违反一个定义规则
- C 是纯虚拟函数,也是一个定义或仅声明
- 从标准库重新定义函数是否违反了一个定义规则
- 是否使用“ __Date__”或“ __Time__”违反了一个定义规则
- 非静态数据成员和一个定义规则
- 如何在C++中声明一个定义为func(cv::Mat &img)的函数
- 现代C和C :可以将一个定义的结构用于其他声明的结构
- C 是平行阵列一个定义的结构
- 当一个定义位于命名空间中时不明确的函数调用
- C++:同名的文件范围常量违反了一个定义规则