簡體   English   中英

使結構不可變有意義嗎?

[英]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和處理SIGINTstop_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM