【发布时间】:2019-06-27 07:27:01
【问题描述】:
自从我从高级 Java 来到 C 以来,我们没有像 const 这样的类型限定符来使类型不可变,我们必须将其所有成员声明为 final 并确保成员本身是不可变的。
按照约定,在 C 中我们有类型限定符 const。
更具体地说,让我提供一个我目前坚持的例子。我有以下
application.h:
struct application_config_t{
int poll_interval;
int compression_ratio;
//other config parameters
};
struct application_t{ //This structure make me confused
void (*run_application)(struct application_t*);
void (*stop_application)(struct application_t*);
};
struct application_t* create_app(const struct application_config_t);
void release_app(struct application_t*);
我不确定如何定义application_t 结构。它的唯一目的是使用run_application 执行实际运行并使用stop_application 处理SIGINT 以执行正常关闭,然后在stop_application 返回后调用release_app(struct application_t*) 以释放内存。
我有以下情况可供选择:
我。不可变application_t
struct application_t{
void (*const run_application)(struct application_t*);
void (*const stop_application)(struct application_t*);
}
我认为这很好,因为一旦创建应用程序就不应修改。但是创建这样一个不可变结构将需要memcpy 调用...
二。可变的application_t,而创建应用程序将被声明为
const struct application_t* create_app(const struct application_config_t);
这很好,但我想在stop_application 返回后释放struct application_t* 指向的内存。释放struct application_t* 意味着appliaction_t 并不是真正的const。和像
struct application_config_t cfg;
//...
const struct application_t *app_ptr = create_app(cfg);
(app_ptr -> run_application)(app_ptr);
release_app((struct application_t *) app_ptr); //const cast
需要对constness 进行强制转换。
【问题讨论】: