为了使库更容易对这些结构实例进行常见操作
消费者,我可以提供内部此类函数的函数指针吗
结构本身?
可以为您的结构赋予函数指针成员,指向其参数包括指向结构类型的指针的函数类型,并且旨在或多或少像 C++ 实例方法一样使用,或多或少如问题中所示。
这是一个好的做法吗?
TL;DR:没有。
您将遇到的第一个问题是正确初始化这些指针成员。尽管名称对应,结构实例中的函数指针不会自动初始化为指向特定函数。除非您使结构类型不透明,否则用户可以(毫无疑问有时will)声明实例而不调用您为此目的提供的任何构造函数模拟函数,然后就会发生混乱。
如果您确实使结构不透明(这毕竟不是一个坏主意),那么无论如何您都需要非成员函数,因为您的用户将无法直接访问函数指针。也许是这样的:
struct my_custom_struct *my_add_tag(struct my_custom_struct *str, tag *tag) {
return str->add_tag(str, tag);
}
但如果你要提供这一点,那么额外的间接层有什么意义呢? (回答only这样做的充分理由是,在不同的实例中,函数指针可以指向不同的函数。)
如果您不使结构变得不透明,则类似的情况也适用。那么您可能会假设用户会(更)直接调用
str->add_tag(str, tag);
但到底是什么让这变得如此便利?
add_tag(str, tag);
?
所以总的来说,不,我不认为这种方法总体上是一个好的做法。在有限的情况下,按照这些思路做一些事情可能是有意义的,但不作为一般的图书馆惯例。
会不会有问题
关于调用实用程序函数的多线程
与不同的论点平行等等?
与以任何其他方式指定的函数一样,除非函数指针本身被修改。
我知道它更接近 C++ 类,但我希望坚持使用 C
并学习如何用过程语言来完成它,而不是
面向对象编程。
如果您想学习 C 语言习惯和约定,请务必这样做。你所描述的不是一类。 C 代码和库绝对可以使用 OO 原则(例如封装)进行设计,在某种程度上甚至是多态性,但通常不会通过您描述的机制来实现。这个答案涉及到一些方法are用于目的。