簡體   English   中英

帶有函數指針的編譯時檢查結構以驗證分配

[英]Compile-time check struct with function pointers to validate assignments

我想知道以下情況是否可能:

我有一個命名空間樣式的結構設置,僅填充了函數指針。 這些在頭文件中提供,如下所示:

typedef struct {

    int32_t(*const event_construct)(struct sync_event* evt);
    int32_t(*const event_destroy)(struct sync_event* evt);
    int32_t(*const event_set)(struct sync_event* evt);
    int32_t(*const event_wait)(struct sync_event* evt);

} namespace_sync;

extern namespace_sync const sync;

在所有功能實現之后,然后在相關的源文件中:

...

namespace_sync const sync = {
    sync_event_construct,
    sync_event_destroy,
    sync_event_set,
    sync_event_wait
};

假設我不想在結尾添加一個額外的功能; 我將其添加到結構和源文件中,但忘記分配它。 因為函數聲明匹配,所以不會為其生成警告,並且編譯器(至少在此示例中為vs2013)不會提供存在問題的提示。

我有可用的編譯時斷言檢查,但是由於結構大小准確,因此不確定是否可以驗證此特定方面。 如果vs2013無法使用它-我知道它是一個糟糕的C編譯器(!)-還將使用最新版本的gcc,因此我可以將功能限制為一個編譯器。

未來的一種解決方案是使用指定的初始化程序:

namespace_sync const sync = {
    .event_construct = sync_event_construct,
    .event_destroy = sync_event_destroy,
    .event_set = sync_event_set,
    .event_wait = sync_event_wait
};

任何未列出的成員將默認為空指針。

我建議不要將成員添加到結構的中間,因為很難確保您已經正確更新了依賴於舊結構布局的任何代碼。 但是,如果您確實想這樣做,那么讓編譯器向您指示該結構的所有用途在哪里的一種方法是更改​​結構名稱:

typedef struct {
    // ...
} namespace_sync_2;

然后,代碼namespace_sync const sync將導致編譯錯誤。 這使您意識到以下事實,即這段代碼需要進行代碼審查,以確保它可以與新的結構布局一起正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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