迭代缓冲区设计问题

问题描述 投票:0回答:2

我正在研究一个事件驱动的应用程序,并希望为系统的低级接口提供高级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");
}

我不确定这种方法是否常用。声明结果类型为intevent_iterator_t **作为out参数是否有任何好处。

int poll_events(watcher_t *watcher, 
               int poll_timeout_millis, 
               void *buffer,
               event_iterator_t **out);
c errno
2个回答
2
投票

我不确定这种方法是否常用。将结果类型声明为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);

2
投票

如果要传播错误,请执行以下操作:1。将返回类型设置为错误/ 0。然后在第二个场景中列出。 2.如果设置errno对你来说已经足够了,如果在适当地设置errno时情况变得严峻,你可能会坚持返回NULL。

您唯一应该坚持的是通过API以相同的方式执行它,并且可以始终指示错误并以相同的方式执行。

© www.soinside.com 2019 - 2024. All rights reserved.