Closed. This question is opinion-based。它当前不接受答案。
想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
2年前关闭。
Improve this question
我有一个C库,它定义了一种类型,例如
这种方法的问题在于C头
即使
注意,我不需要
解决此问题的一种方法可能是使用
现在,只有
但是,此解决方案附带使用
有更好的解决方案吗?这应该:
将C库包装在C++对象包装器 中在单独的编译单元中“隐藏” C头
使用包装程序 独立于C++代码确保到处的类型安全
然后,您的C++ header 可能如下所示:
请注意,此操作的工作方式,
想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
2年前关闭。
Improve this question
我有一个C库,它定义了一种类型,例如
myCtype
,以及一些使用myCtype
type变量的例程。我想将C++对象定义为单个myCtype
变量的包装器。让我们假设包含myCtype
定义的C头是myCtype.h
。具有头mywrapper.hpp
和mywrapper.cpp
中的代码实现的C++代码看起来像mywrapper.hpp
:extern "C" {
#include "myCtype.h"
}
class mywrapper
{
myCtype v;
public:
//...
// Constructor and some methods here
// ...
}
mywrapper.cpp
:#include "mywrapper.hpp"
// ...
// Constructor and methods of mywrapper here
// ...
这种方法的问题在于C头
myCtype.h
可能包含几个“C样式”宏,定义和内联函数,它们可能与其余的C++代码冲突。由于mywrapper.hpp
的定义,myCtype.h
需要包括myCtype
。因此,每当我想使用mywrapper
是C++代码时,都需要包括mywrapper.hpp
,这将不需要的myCtype.h
聚集在一起。即使
myCtype.h
的定义和内联函数与当前的C++代码不冲突,也希望将它们从C++代码中隐藏起来。注意,我不需要
myCtype
成员mywrapper::v
可见,因为我宣布它为私有(private)。因此,出于所有目的,使用mywrapper
的C++代码可以完全忽略myCtype.h
的内容解决此问题的一种方法可能是使用
void *
指针保存myCtype
的实例,如下所示。mywrapper.hpp
:class mywrapper
{
void *v;
public:
mywrapper();
virtual ~mywrapper();
//...
// some methods here
// ...
}
mywrapper.cpp
:#include "mywrapper.hpp"
#include <cstdlib>
extern "C" {
#include "myCtype.h"
}
mywrapper::mywrapper() : v(malloc(sizeof(myCtype)))
{
// Some initialization of v here
}
virtual mywrapper::~mywrapper()
{
free(v);
}
// ...
// Methods of mywrapper here
// ...
现在,只有
mywrapper.cpp
的编译单元包括myCtype.h
,而包括mywrapper.hpp
的C++代码不会带来myCtype.h
。但是,此解决方案附带使用
void *
指针的类型不安全。有更好的解决方案吗?这应该:
myCtype.h
,使用包装程序
最佳答案
将库代码隔离在一个编译单元中并用您自己的接口(interface)包装实际上是一项非常常见的设计任务。显然,除了void类型指针之外,您已经非常接近解决方案的要求。
前向声明可以为您解决该问题,但是我认为myCtype
是typedef
吗?如果是这样,我会建议您稍微断开隔离并查看库头文件。说myCtype
定义如下:
typedef struct _myCtype {
// Members...
} myCtype
然后,您的C++ header 可能如下所示:
class mywrapper
{
struct _myCtype *v;
// More members...
}
请注意,此操作的工作方式,
mywrapper.hpp
不需要包括myCtype.h
header ,因为它是一个前向声明。但是在mywrapper.cpp
中,如果在顶部包括myCtype.h
,则成员v
将被视为适当的myCtype
指针,而无需强制转换。关于c++ - 在C++对象包装器中安全包含C代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52093499/
10-09 13:41