【问题标题】:Encapsulation in driver wrapper using an abstract struct使用抽象结构封装在驱动程序包装器中
【发布时间】:2021-11-11 14:30:18
【问题描述】:

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

//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;
    }
}

感谢您的帮助和建议!

【问题讨论】:

标签: c embedded driver wrapper


【解决方案1】:

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

但是,许多用 C 编写的开源项目(例如 linux)都有编码标准,禁止 typdef a struct 并禁止 typedef a pointer。他们说使用你的代码的人知道什么是指针和什么是复合类型很重要,所以你不应该试图隐藏这一点。

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

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

【讨论】:

  • 所谓的“Linux内核编码标准”是一个业余级别的文档,不应该过分关注。同样,在频谱的另一端,Windows API 因其糟糕的类型系统而臭名昭著。 typedef 指针不是一个好主意,即使在创建不透明类型时也是如此。或者你得到HANDLE* 的 Windows API 疾病,其中 HANDLE 实际上是一个开始的指针。这种不必要的重定向会减慢代码速度。
  • 我认为问题不在于减慢代码速度,而在于让人们感到困惑,以至于他们不知道自己的代码实际上在做什么。
猜你喜欢
  • 2012-05-24
  • 2012-02-16
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
  • 2012-09-27
  • 2017-11-29
  • 1970-01-01
  • 2011-02-28
相关资源
最近更新 更多