gpt4 book ai didi

c - 在推出自己的结构时提供辅助功能

转载 作者:太空狗 更新时间:2023-10-29 16:05:11 24 4
gpt4 key购买 nike

如果我正在开发一个 C 共享库并且我有自己的结构。为了使库使用者更容易对这些结构实例执行常见操作,我可以在结构本身内部提供指向此类函数的函数指针吗?这是一个好习惯吗?在使用不同参数并行调用效用函数等情况下,多线程会不会出现问题?

我知道它更接近于 C++ 类,但我希望坚持使用 C 并了解如何使用过程语言而不是 OOP 来完成它。

举个例子

typedef struct tag tag;
typedef struct my_custom_struct my_custom_struct;

struct tag
{
// ...
};

struct my_custom_struct
{
tag *tags;
my_custom_struct* (*add_tag)(my_custom_struct* str, tag *tag);
};

my_custom_struct* add_tag(my_custom_struct* str, tag *tag)
{
// ...
}

其中 add_tag 是一个助手,它设法将标签添加到 *str 内的标签列表中。我在 libjson-c 中看到了这种模式,就像这里- http://json-c.github.io/json-c/json-c-0.13.1/doc/html/structarray__list.html . array_list 中给出了一个函数指针来帮助释放它。

最佳答案

To make common operations on these struct instances easier for library consumers, can I provide function pointers to such functions inside the struct itself?

可以为您的结构赋予函数指针成员,指向函数类型,其参数包括指向您的结构类型的指针,并且旨在或多或少像 C++ 实例方法一样使用,或多或少如所呈现的那样在问题中。

Is it a good practice?

长话短说:没有。

您将遇到的第一个问题是正确初始化这些指针成员。尽管名称对应,结构实例中的函数指针不会自动初始化为指向特定函数。除非您使结构类型不透明,否则用户可以(毫无疑问,有时)声明实例,而无需调用您为此目的提供的任何构造函数模拟函数,然后困惑就会接踵而至。

如果您确实使结构不透明(毕竟这不是一个坏主意),那么无论如何您都需要非成员函数,因为您的用户将无法直接访问函数指针。也许是这样的:

struct my_custom_struct *my_add_tag(struct my_custom_struct *str, tag *tag) {
return str->add_tag(str, tag);
}

但是,如果您要提供这些,那么额外的间接级别有什么意义呢? (答案:唯一这样做的充分理由是在不同的实例中,函数指针可以指向不同的函数。)

如果您不使结构不透明,则类似情况也适用。那么您可能会假设用户会(更多)直接调用

str->add_tag(str, tag);

但究竟是什么使它成为简单的便利

add_tag(str, tag);

?

所以总的来说,不,我一般不会认为这种方法是一种好的做法。在有限的情况下,按照这些思路做一些事情可能是有意义的,但不是一般的图书馆惯例。

Would there be issues with respect to multithreading where a utility function is called in parallel with different arguments and so on?

与以任何其他方式指定的函数一样,除非函数指针本身被修改。

I know it goes a lot closer to C++ classes but I wish to stick to C and learn how it would be done in a procedural language as opposed to OOP.

如果您想学习 C 习语和约定,那么一定要这样做。你所描述的不是一个。 C 代码和库绝对可以使用 OO 原则(例如封装)进行设计,在某种程度上什至可以使用多态性,但通常不会通过您描述的机制来实现。此答案涉及用于此目的的一些方法。

关于c - 在推出自己的结构时提供辅助功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57415496/

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