C结构的良好编码实践?

mri*_*man 3 c struct

在C中,您可以定义结构来保存各种变量;

typedef struct {
    float       sp;
    float       K;                 // interactive form - for display only
    float       Ti;                //  values are based in seconds
    float       Td;
} pid_data_t;
Run Code Online (Sandbox Code Playgroud)

但让说K,TiTd不应该被公开设置,并且只能用于他们被操纵后存储的值.所以,我希望这些值不被更新;

pid_data_t = pid_data;
pid_data.K = 10;         // no good! changing K should be done via a function
Run Code Online (Sandbox Code Playgroud)

我想通过一个函数设置它们;

int8_t pid_set_pid_params(float new_K_dash, float new_Ti_dash, 
    float new_Td_dash)
{
    …                             // perform lots of things
    pid_data->K  = new_K_dash;
    pid_data->Ti = new_Ti_dash;
    pid_data->Td = new_Td_dash;
}
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?我知道C++使用类似于get/set属性,但是想知道人们可能在C上做什么.

Ker*_* SB 5

你的公共接口只提供了一个不透明的指针(也许DATA*,或data_handle),以及处理函数create_data(),set_data_value(),read_data_value(),free_data(),等,这在不透明的指针操作.

非常喜欢FILE*.

只是不要给你的客户端内部头文件:-)

// library.h

typedef struct data_t * data_handle;

data_handle create_data();
void        free_data(data_handle);
Run Code Online (Sandbox Code Playgroud)

私人实施(不发货):

#include "library.h"

struct data_t
{
  /* ... */
};

data_handle create_data() { return malloc(sizeof(struct data_t)); }
void        free_data(data_handle h) { free(h); }
/* etc. etc. */
Run Code Online (Sandbox Code Playgroud)