库创建:标准解决方案?

时间:2012-05-10 10:12:33

标签: c architecture standards

我想知道是否有一种标准的方法可以解决我遇到的那种问题:

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

lib应该有助于解决特定问题,因此可以预期在开始时创建的数据将用于稍后进行计算。

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

我的想法是:

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

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

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

3 个答案:

答案 0 :(得分:6)

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

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

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

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

  2. errorcode = foo_set_option (handle, OPTION,...); - 然后设置一些关于库在解决问题时应该如何表现的特殊选项。这可能是可选的。在内部,这可能会更改handle指向的结构来设置选项。

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

  4. 您可能希望通过调用另一个库函数来“读取”解决方案。同样,handle是一个参数。

  5. 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库通过使用typedefsvoid *指针来完成此操作。然后让函数将对象作为第一个参数,然后将其转换为库内部数据结构并使用它。

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

这只是我的意见