Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 库创建:标准解决方案?_C_Architecture_Standards - Fatal编程技术网

C 库创建:标准解决方案?

C 库创建:标准解决方案?,c,architecture,standards,C,Architecture,Standards,我想知道是否有一种标准的方法来解决我所面临的问题: 我正在用C编写一个库。这个库将提供不同类型的函数,例如用特定类型的数据填充数组或用这些数据进行计算的函数 lib应该有助于解决一个特定的问题,因此人们可能期望在开始时创建的数据将用于以后的计算 因此,有一些数据应该在问题解决过程中共享,比如数组的大小或其他一些对计算有用的参数。 我希望避免将这些数据作为每个函数的参数,即将数组的大小传递给每个函数 我的想法是: 创建一组只能从库函数访问的静态全局变量 为这些变量创建一个setter/getter

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

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

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

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

我的想法是:

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

为这些变量创建一个setter/getter,定义一个自定义枚举类型,该类型将用于寻址要设置/获取的确切变量,即setkScaleFactor,10


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

您可以模仿面向对象的方法。X11库通过使用typedefs使*指针无效来实现这一点。然后使用函数将对象作为第一个参数,然后将其强制转换为库内部数据结构并使用它

我觉得使用静态将是非常有限的


这只是我的观点

库设计的标准方法是设计一组数据结构并对其执行操作。如果你的库在矩阵上工作,那么你定义

typedef struct {
    double *contents;
    size_t ncolumns, nrows;
} Matrix;
然后在这种类型的原型上添加一些有用的函数,如图所示:

Matrix *make_matrix(size_t, size_t);
Matrix *matrix_multiply(Matrix const *, Matrix const *);

参见派克的《复杂性规则5:数据占主导地位》。

许多库对问题的每个“实例”都使用“句柄”的概念。通过这种方式,您可以同时打开多个句柄,而不会干扰彼此的执行,即使调用是分散的

示例:C的标准输入输出有一个文件句柄,libcURL有一个CURL句柄

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

FOO handle=FOO_init…;-您可以获得特定于您的问题的句柄。FOO通常是指向不透明结构的指针,该结构包含特定于您要解决的问题的特定“实例”的所有信息。库提供的所有其他函数都采用FOO handle参数,因此它们知道自己正在处理的问题的实例。如果init失败,则会得到NULL

errorcode=foo\u set\u选项句柄,选项,…-然后设置一些关于库在解决问题时应如何运行的特殊选项。这可能是可选的。在内部,这可能会更改句柄指向的结构以设置选项

errorcode=foo_执行句柄;-您执行一个解决方案

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

foo_清理句柄;-完成后,您可以让库清理它分配的任何内部数据结构,并释放它占用的任何其他资源