C中的数据封装

Tom*_* L. 5 c embedded malloc struct

我目前正在开发一个嵌入式系统,我在电路板上有一个组件,它出现了两次.我想为组件提供一个.c和一个.h文件.

我有以下代码:

typedef struct {
    uint32_t pin_reset;
    uint32_t pin_drdy;
    uint32_t pin_start;
    volatile avr32_spi_t *spi_module;
    uint8_t cs_id;  
} ads1248_options_t;
Run Code Online (Sandbox Code Playgroud)

这些都是硬件设置.我创建了这个结构的两个实例(每个部分一个).

现在我需要在后台保留一组值.例如,我可以每秒从该设备读取值,并且我想保留最后100个值.我希望这些数据不能从我的组件的"外部"访问(仅通过我的组件中的特殊功能).

我不确定如何在这里继续.我真的需要将数组作为结构的一部分吗?我想到的是做以下事情:

int32_t *adc_values; // <-- Add this to struct

int32_t *adc_value_buffer = malloc(sizeof(int32_t) * 100); // <-- Call in initialize function, this will never be freed on purpose
Run Code Online (Sandbox Code Playgroud)

然而,我将能够从我的代码中的任何地方(也来自我的组件外部)访问我的int32_t指针,这是我不喜欢的.

这是唯一的方法吗?你知道更好的方法吗?

谢谢.

Lun*_*din 16

对于为微控制器编写硬件驱动程序的具体情况,请考虑这样做.

否则,请使用opaque/incomplete类型.你会惊讶地发现,很少有C程序员知道如何实际实现自定义类型的100%私有封装.这就是为什么关于C缺乏称为私有封装的OO特性的一些持久性神话.这个神话源于缺乏C知识,而不是其他任何东西.

这是怎么回事:

ads1248.h

typedef struct ads1248_options_t ads1248_options_t; // incomplete/opaque type

ads1248_options_t* ads1248_init (parameters); // a "constructor"
void ads1248_destroy (ads1248_options_t* ads); // a "destructor"
Run Code Online (Sandbox Code Playgroud)

ads1248.c

#include "ads1248.h"

struct ads1248_options_t {
    uint32_t pin_reset;
    uint32_t pin_drdy;
    uint32_t pin_start;
    volatile avr32_spi_t *spi_module;
    uint8_t cs_id;  
};

ads1248_options_t* ads1248_init (parameters)
{
  ads1248_options_t* ads = malloc(sizeof(ads1248_options_t));
  // do things with ads based on parameters
  return ads;
}

void ads1248_destroy (ads1248_options_t* ads)
{
  free(ads);
}
Run Code Online (Sandbox Code Playgroud)

main.c中

#include "ads1248.h"

int main()
{
  ads1248_options_t* ads = ads1248_init(parameters);
  ...
  ads1248_destroy(ads);
}
Run Code Online (Sandbox Code Playgroud)

现在main中的代码无法访问任何struct成员,所有成员都是100%私有的.它只能创建一个指向struct对象的指针,而不是它的实例.作品正是像在C++抽象基类,如果你是熟悉.唯一的区别是你必须手动调用init/destroy函数,而不是使用真正的构造函数/析构函数.

  • 如果您尝试访问私有成员,则会出现编译器错误。良好的反应伦德林。 (2认同)