使用抽象结构封装在驱动程序包装器中

Encapsulation in driver wrapper using an abstract struct

我想问一下,这是否是我的驱动程序包装器封装的有效方法,或者是否有更好的方法。我的目标是隐藏底层驱动的句柄,所以头文件不包含驱动库。

//wrapper_foo.h
typedef struct WrapperCtrl WrapperCtrl;
typedef WrapperCtrl *WrapperHandle;

WrapperHandle wrapper_open_device();

//wrapper_foo.c
#include "wrapper_foo.h"
#include "driver.h"
#include <stdint.h>



struct WrapperCtrl {
    uint8_t wrapper_specific_parameter;
    driver_handle handle;
};

static WrapperCtrl wrapper_cfg;



WrapperHandle wrapper_open_device() {
    WrapperHandle w_handle = &wrapper_cfg;
    w_handle->handle = driver_open_device(); 
    if (w_handle->handle == NULL) {
        return NULL;
    } else {
        return w_handle;
    }
}

感谢您的帮助和建议!

在 header 中声明但不定义结构并保持定义私有被广泛认为是 C 中的良好封装实践。如果结构的某些成员是需要包含您不想包含在其他地方的额外 header 的类型,这将特别有用。

然而,许多用 C 编写的开源项目(例如 linux)的编码标准禁止 typdef 结构和禁止 typedef 指针。他们说使用您的代码的人知道什么是指针以及什么是复合类型很重要,因此您不应该试图隐藏这一点。

对此意见不一,您所做的是(或至少曾经是)基于 windows 的代码中的常见做法,因此您应该考虑此代码所在行业的常见风格是什么将被使用。

最后,具有 returns 指向静态数据的指针的函数在 C 应用程序中相当普遍,但它确实限制了代码的可扩展性并可能阻止它 re-used 作为图书馆。您需要仔细考虑是否真的只会有一个这种类型的实例。也许你需要有一对使用堆内存分配和释放这种类型的实例的函数。