C中的可重入库设计

C中的可重入库设计,第1张

概述假设我正在构建一个库,以便在C中使用quuxes. Quuxes需要两个状态变量成功sporked: static int quux_state;static char* quux_address;/* function to spork quuxes found in a file, reads a line from the file each time it's called. 假设我正在构建一个库,以便在C中使用quuxes.

Quuxes需要两个状态变量成功sporked:

static int quux_state;static char* quux_address;/* function to spork quuxes found in a file,reads a line from the file each time it's called. */voID spork_quux(file*);

如果我将这些数据存储为全局变量,那么只有一个客户端能够一次启动quuxes,否则状态变量将被第二个调用者破坏,并可能发生灾难.

问题是在C中设计可重入库的最佳方法是什么?

我接受了以下案件,但没有令人满意的结论.

在下面的例子中,问题是如何将客户关联到每个州?

/* library handles all state data allocation */static int* quux_state; static char** quux_address;

在下面的例子中,客户端能够搞乱状态,非常不受欢迎

/* let each clIEnt store state */typedef struct { int state; char* address; } QuuxState; QuuxState spork_quux(file*);

那么,如何正确地做到这一点?

解决方法 使用结构,但不要将定义公开给客户端.

即.在.h头文件中放:

typedef struct QuuxState QuuxState;QuuxState *spork_quux(file*);

并在.c实现文件中:

struct QuuxState{    int state;    char* address;};QuuxState *spork_quuxfile *f){    QuuxState *quuxState = calloc(1,sizeof(*quuxState));    if (!quuxState)        return NulL;    quuxState->state = ....;    ........    return quuxState;}

这种方法的优点是:

>您可以更改结构的内容,而无需重新编译所有客户端代码
>客户端代码无法访问成员,即. quuxState-> state会给编译器错误
>调试器仍然可以完全看到QuuxState结构,因此您可以轻松地查看值并设置观察点等.
>不需要铸造
>你要返回的类型是一个特定的类型,所以你会得到一些编译器检查正确的东西是否被传递(与voID *指针相比)

唯一的缺点是你必须分配一块内存 – 但是假设你的库正在做任何不重要的事情(如果它正在进行文件I / O,那肯定是非平凡的),单个malloc的开销可以忽略不计.

您可能希望将上述函数重命名为“QuuxSpork_create”,并添加更多函数来处理执行逐行工作并在完成后销毁状态.

voID QuuxSpork_readline(QuuxState *state){    ....}voID QuuxSpork_destroy(QuuxState *state){    free(state);}

像这样工作的库的随机示例是POSIX线程库,pthreads.

总结

以上是内存溢出为你收集整理的C中的可重入库设计全部内容,希望文章能够帮你解决C中的可重入库设计所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1236435.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存