gpt4 book ai didi

c - 函数前缀与 C 中的 "Function Struct"

转载 作者:太空宇宙 更新时间:2023-11-04 00:57:56 24 4
gpt4 key购买 nike

我正在尝试找出 C(11) 中的最佳实践。因为没有 namespace ,所以我可以想到两种方法来避免名称冲突:

a.) 函数前缀

void kernel_init(void) { ... }
int kernel_start(void* foo) { ... }

b.) “函数结构”

struct kernel {
void (*init)(void);
int (*start)(void* foo);
} kernel;

我不是在问哪种方法更漂亮,因为那是相当主观的。我要问的是,除了代码风格之外,这两种方法是否有任何明显的缺点?这包括一开始不相关但一旦代码库增长就会成为大问题的小问题。

最佳答案

有趣的是,我以前从未想过这种解决方案。

第一个当然是标准的,我敢打赌你会在绝大多数 C 项目中找到它[*]。

理论上第二个占用内存,因为您实际上是在声明一个充满函数指针的数据对象。您当然还需要初始化 kernel 变量,即:

...
} kernel = {
.init = kernel_init,
.start = kernel_start,
};

但是哦,你又用前缀函数了。为了消除对这些的需求,函数必须是 static,我想如果您将 extern 添加到 struct 中的声明中,这是可能的内核.h

所以一个更完整的例子可能是:

// kernel.h (public header)
typedef struct kernel_api {
void (*init)(void);
int (*start)(void* foo);
} kernel_api;

extern const kernel_api kernel;

// in kernel.c
static void init(void)
{
...
}

static int start(void *foo)
{
..
}

const kernel_api kernel = {
.init = init,
.start = start,
};

这可能有用,但我还没有尝试过。

最后,拥有显式数据意味着需要足够智能的编译器来优化这些数据并进行更直接的调用,但我还没有尝试过,依赖它有点冒险。有趣。

[*] 我想我只是在统计上声称我已经看到(或想到)了世界上绝大多数的 C 项目,但这当然不是真的。 :)

关于c - 函数前缀与 C 中的 "Function Struct",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52420143/

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