Closed. This question is opinion-based。它当前不接受答案。












想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。

2年前关闭。



Improve this question




我有一个C库,它定义了一种类型,例如myCtype,以及一些使用myCtype type变量的例程。我想将C++对象定义为单个myCtype变量的包装器。让我们假设包含myCtype定义的C头是myCtype.h。具有头mywrapper.hppmywrapper.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 *指针的类型不安全。

有更好的解决方案吗?这应该:
  • 将C库包装在C++对象包装器
  • 在单独的编译单元中“隐藏” C头myCtype.h
    使用包装程序
  • 独立于C++代码
  • 确保到处的类型安全
  • 最佳答案

    将库代码隔离在一个编译单元中并用您自己的接口(interface)包装实际上是一项非常常见的设计任务。显然,除了void类型指针之外,您已经非常接近解决方案的要求。

    前向声明可以为您解决该问题,但是我认为myCtypetypedef吗?如果是这样,我会建议您稍微断开隔离并查看库头文件。说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