因为我是从更高层次的Java,我们没有类型quialifiers像const
为了使一种不可改变的,我们必须所有成员宣布最终并确保成员是不可变的自己来到℃。
通过合同,在C中有类型限定符qazxsw POI。
更具体地讲,让我提供我目前坚持了一个例子。我有以下
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*);
结构。它的唯一目的是做actaul奔跑与application_t
和处理run_application
与SIGINT
执行正常关闭,再经过stop_application
返回到调用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*);
}
反正叫...
II。易变memcpy
而创建的应用程序将被宣布为
application_t
这将是很好,但我想释放const struct application_t* create_app(const struct application_config_t);
返回后,指向的内存由struct application_t*
。释放stop_application
意味着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
ness投。
释放结构应用T *意味着应用程序是不是真的常量
其实这是。客户端代码可以发生变异它,不应该将其移交反正const
后进一步用它来。这是release_app
其整个生命周期,如果const
接受由指针为const,这将是语义正确的(只是做内部release_app
投)。
为什么我说这将是语义正确的?因为当release_app
的结构分配空间并初始化它,它不是在create_app
有,是什么呢?该const
添加后作为合同的一部分。因此,在接受一个const
常量指针只是跟着你已经建立的同一合同。事实的API对知道存储可以被突变不撕毁合同。