这有什么意义,使结构不变?

问题描述 投票:2回答:1

因为我是从更高层次的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_applicationSIGINT执行正常关闭,再经过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投。

c struct const
1个回答
3
投票

释放结构应用T *意味着应用程序是不是真的常量

其实这是。客户端代码可以发生变异它,不应该将其移交反正const后进一步用它来。这是release_app其整个生命周期,如果const接受由指针为const,这将是语义正确的(只是做内部release_app投)。

为什么我说这将是语义正确的?因为当release_app的结构分配空间并初始化它,它不是在create_app有,是什么呢?该const添加后作为合同的一部分。因此,在接受一个const常量指针只是跟着你已经建立的同一合同。事实的API对知道存储可以被突变不撕毁合同。

© www.soinside.com 2019 - 2024. All rights reserved.