gpt4 book ai didi

带有函数指针的编译时检查结构以验证分配

转载 作者:行者123 更新时间:2023-11-30 17:28:35 25 4
gpt4 key购买 nike

我想知道以下是否可行:

我有一个命名空间样式的结构设置,仅填充函数指针。这些在头文件中提供,如下所示:

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,因此我可以将功能限制为一个编译器。

最佳答案

future 的一个解决方案是使用指定的初始化器:

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 constsync将会导致编译错误。这提醒您这样一个事实:这段代码需要进行代码审查,以确保它能够在新的结构布局中正常工作。

关于带有函数指针的编译时检查结构以验证分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26006097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com