0

我想知道是否有一种标准方法来解决我面临的这种问题:

我正在用 C 编写一个库。该库将提供不同类型的函数,例如用特定类型的数据填充数组或使用这些数据进行计算的函数。

该库应该有助于解决特定问题,因此人们可能期望一开始创建的数据将用于以后进行计算。

因此,有一些数据应该在问题解决过程中“共享”(例如数组的大小或对计算有用的一些其他参数)。
我想避免将这些数据作为每个函数的参数(即将数组的大小传递给每个函数)。

我的想法是:

  • 创建一组只能从库函数访问的静态全局变量。

  • 为这些变量创建一个 setter/getter,定义一个自定义enum类型,该类型将用于处理要设置/获取的确切变量(即set(kScaleFactor, 10))。

然而,正如我之前所说,是否有一种“标准”(或常用)方法来解决这个问题?我的方法可以考虑吗?

4

3 回答 3

6

许多图书馆对问题的每个“实例”都使用“句柄”的概念。这样,您可以同时打开多个句柄,并且不会干扰彼此的执行,即使调用是穿插的。

示例:C 的标准输入输出有FILE句柄,libcURL 有CURL句柄。

使用它们时的程序流程通常是这样的[我正在使用一个虚构的库foo]:

  1. FOO handle = foo_init (...);- 你得到一个handle特定于你的问题的。FOO通常是指向不透明结构的指针,该结构包含特定于您要解决的问题的特定“实例”的所有信息。库提供的所有其他FOO handle函数都带有一个参数,因此他们知道他们正在处理的问题的实例。如果init失败,你会得到一个NULL.

  2. errorcode = foo_set_option (handle, OPTION,...);- 然后设置一些特殊选项,了解库在解决问题时的行为方式。这可能是可选的。在内部,这可能会更改指向的结构handle以设置选项。

  3. errorcode = foo_execute (handle);- 你执行一个解决方案。

  4. 您可能想通过调用另一个库函数来“阅读”解决方案。再次,handle是一个参数。

  5. foo_cleanup (handle);- 完成后,让库清理它分配的任何内部数据结构,并释放它占用的任何其他资源。

于 2012-05-10T10:39:37.853 回答
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关于 C 编程的注释,复杂性规则 5:数据占主导地位

于 2012-05-10T10:23:49.967 回答
1

您可以模拟面向对象的方法。X11 库通过使用指向指针来做到这typedefs一点void *。然后具有将对象作为第一个参数的函数,然后将其转换为库内部数据结构并使用它。

我觉得使用static会非常有限。

这只是我的看法

于 2012-05-10T10:18:11.147 回答