c - 遍历缓冲区设计问题
问题描述
我正在开发一个事件驱动的应用程序,并希望为系统的低级接口提供高级 API。我目前对如何errno
向下传播调用堆栈存有疑问。这是我当前的 API
typedef struct watcher_t watcher_t;
typedef struct event_iterator_t event_iterator_t;
event_iterator_t *poll_events(watcher_t *watcher,
int poll_timeout_millis,
void *buffer);
const char* take_event_path(void *event_buffer,
event_iterator_t *iterator);
问题是轮询事件的调用者目前除了使用errno
. 我是说
#include <errno.h>
void *buf = //...
watcher_t *watcher_ptr = //...
event_iterator_t * iterator_ptr = poll_events(watcher_ptr, 1000, buf);
if(iterator_ptr == NULL){
perror("Error while getting iterator");
}
我不确定这种方法是否常用。int
将结果类型声明为和event_iterator_t **
作为输出参数有什么好处。
int poll_events(watcher_t *watcher,
int poll_timeout_millis,
void *buffer,
event_iterator_t **out);
解决方案
我不确定这种方法是否常用。将结果类型声明为 int 并将 event_iterator_t ** 声明为 out 参数有什么好处。
这两种方法都很常见。但是当函数返回int
结果代码时,它更容易成为线程安全的并且 API 更容易记录。
我建议使用以下方法:
- 返回一个 int 作为结果代码
- 传递一个上下文处理程序作为第一个参数,它将包含观察者、迭代器等。
例子:
int api_init_context(api_context_t *ctx);
int api_add_watcher(api_context_t *ctx, watcher_t *watcher);
int api_poll_events(api_context_t *ctx, int poll_timeout_millis, void *buffer);
int api_take_event_path(api_context_t *ctx, void *event_buffer);
推荐阅读
- progressive-web-apps - PWA。如何向用户提供安装应用程序的报价?
- node.js - 运行时应用程序
- javascript - 从 URL 预填充 HTML 表单文本
- python - 来自磁条索引的信用卡输入
- windows - 如何让 bazel 使用特定的 VC++ 工具集?
- jupyter-notebook - 使用 HTML 在 Jupyter notebook markdown 中并排放置两个图像是不可能的吗?
- r - 如果分钟是双倍的,为什么分钟的最小值是 0?
- r - 在 R 中的循环中创建嵌套列表
- c - C 中的相同代码导致不同的输出
- mongodb - 当添加额外的 mongoose model.save() 时,Promise.all() 失败