gpt4 book ai didi

c - 从单 getter 函数中检索可变类型数据的方法

转载 作者:太空宇宙 更新时间:2023-11-04 04:55:47 25 4
gpt4 key购买 nike

tl;dr:单个 getter func 的首选函数签名,它处理一个对象的可能不同类型的所有 可读成员。

从库中公开 struct 定义并在程序中使用它们有助于成为 ABI 破坏者,当这样的结构需要时,例如一个新成员。在重要的地方,人们更喜欢使用基于函数的 getter/setter。然而,为每个成员设置一个 setter 函数听起来很麻烦,而且实际上会使 DSO 的符号表膨胀,所以如果可以避免这种情况就更好了。这有点适用于使用可变参数的 setter 部分:

struct foo {
char *name;
int size;
};
int foo_set(struct foo *foo, enum foo_field opt, ...) {
va_list args;
va_start(args, opt);
if (opt == FOO_NAME)
foo->name = strdup(va_arg(args, const char *));
if (opt == FOO_SIZE)
foo->size = va_arg(args, int);
va_end(args);
return 0;
}

鉴于这种方法,人们更喜欢 getter 的什么?——毕竟,类型需要传回。

/* Return codes reserved to indicate failure/success */
int foo_get(struct foo *foo, enum foo_field opt, void *p) {
if (opt == FOO_NAME)
*(char **)p = foo->name;
if (opt == FOO_SIZE)
*(int *)p = foo->size;
return 0;
}

在这种情况下,调用 foo_get 的程序需要知道获取 FOO_NAME/FOO_SIZE 会返回一个 char */int *。如果这条规则被打破,如果返回类型变得不同,库肯定可以添加一个新的 FOO_NAME2。

struct foo {
struct qstr *name;
int size;
};
if (opt == FOO_NAME)
return -EINVAL;
if (opt == FOO_NAME2)
*(struct qstr **)p = foo->name;

人们使用的其他常见方法(单 setter/getter 方法)有哪些?

编辑 2011-12-19:

额外的内联函数怎么样,因为它们将被内联或删除,所以不计入库 ABI。

static inline int foo_get_name(struct foo *foo, const char **pptr) {
return foo_get(foo, FOO_NAME, pptr); /* possibly heavy-duty */
}

最佳答案

正如 Oli 评论的那样,您正在牺牲类型安全性。您还迫使人们处理通过指针传递的内存缓冲区,这很快就会变得尴尬。只需为每个公共(public)数据成员创建一个 getter。就与旧版本库的向后兼容性而言,这是一个 ABI 破坏者,但如果您从不删除 getter,它仍会保持向前兼容性。

关于c - 从单 getter 函数中检索可变类型数据的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8459467/

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