[英]Does it make any sense to make struct immutable?
自從我從高級Java進入C語言以來,我們沒有像const
這樣的類型查詢器才能使類型不可變,因此我們必須將其所有成員聲明為final,並確保成員本身是不可變的。
根據合同,在C中,我們有類型quaalifier 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
結構。 它的唯一目的是做actaul奔跑與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*);
}
我認為這很好,因為一旦創建應用程序就不應對其進行修改。 但是創建這樣一個不可變的結構無論如何都要進行memcpy
調用...
二 。 創建應用application_t
時可變的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
需要對投const
湖。
釋放結構application_t *意味着應用並不是真正的const
其實是。 客戶端代碼無法對其進行更改,並且無論如何都應將其移交給release_app
之后再使用它。 它在整個生命周期中都是const
,並且如果release_app
被指向const的指針接受,則它在語義上是正確的(只需在release_app
內部進行release_app
)。
為什么我說它在語義上是正確的? 因為當create_app
為該結構分配空間並對其進行初始化時,它不是其中的const
,不是嗎? const
將在以后作為合同的一部分添加。 因此,在release_app
接受const指針只是遵循您已經建立的相同協定。 API對知道存儲可以被更改的事實並沒有違反合同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.