我想知道是否有一种标准的方法可以解决我遇到的那种问题:
我正在用C编写一个库.lib将提供不同类型的函数,例如用特定类型的数据填充数组或用这些数据进行计算的函数。
lib应该有助于解决特定问题,因此可以预期在开始时创建的数据将用于稍后进行计算。
因此,有一些数据应该在问题解决过程中“共享”(例如数组的大小或其他一些对计算有用的参数)。
我想避免将这些数据作为每个函数的参数(即将数组的大小传递给每个函数)。
我的想法是:
创建一组只能从库函数访问的静态全局变量。
为这些变量创建一个setter / getter,定义一个自定义enum
类型,用于解决设置/获取的确切变量(即set(kScaleFactor, 10)
)。
正如我之前所说,是否有一种“标准”(或常用)方式来解决这个问题?我的方法可以考虑好吗?
答案 0 :(得分:6)
许多图书馆对问题的每个“实例”使用“句柄”的概念。这样,您可以同时打开多个句柄,并且不会弄乱彼此的执行,即使这些调用是散布的。
示例:C的标准输入输出具有FILE
句柄,libcURL具有CURL
句柄。
使用它们时的程序流程通常是这样的[我正在使用一个虚构的库foo
]:
FOO handle = foo_init (...);
- 您获得了特定于您的问题的handle
。 FOO
通常是指向不透明结构的指针,该结构包含特定于您要解决的问题的特定“实例”的所有信息。库提供的所有其他函数都带有FOO handle
参数,因此他们知道他们正在处理的问题的哪个实例。如果init
失败,您会收到NULL
。
errorcode = foo_set_option (handle, OPTION,...);
- 然后设置一些关于库在解决问题时应该如何表现的特殊选项。这可能是可选的。在内部,这可能会更改handle
指向的结构来设置选项。
errorcode = foo_execute (handle);
- 您执行解决方案。
您可能希望通过调用另一个库函数来“读取”解决方案。同样,handle
是一个参数。
foo_cleanup (handle);
- 完成后,让图书馆清理它分配的所有内部数据结构,并释放它占用的任何其他资源。
答案 1 :(得分:2)
库设计的标准方法是设计一堆数据结构并对它们实施操作。如果您的图书馆使用,例如,矩阵,您可以定义
typedef struct {
double *contents;
size_t ncolumns, nrows;
} Matrix;
然后你在这个类型上添加了一堆有用的函数(只显示原型):
Matrix *make_matrix(size_t, size_t);
Matrix *matrix_multiply(Matrix const *, Matrix const *);
请参阅Pike的Notes on Programming in C,复杂性规则5:数据支配。
答案 2 :(得分:1)
您可以模拟面向对象的方法。 X11库通过使用typedefs
到void *
指针来完成此操作。然后让函数将对象作为第一个参数,然后将其转换为库内部数据结构并使用它。
我觉得使用static
会非常有限。
这只是我的意见