我正在研究事件驱动的应用程序,并且想为系统的低级接口提供高级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 **
作为out参数有什么好处。
int poll_events(watcher_t *watcher,
int poll_timeout_millis,
void *buffer,
event_iterator_t **out);
答案 0 :(得分:2)
我不确定这种方法是否常用。将结果类型声明为int并将event_iterator_t **声明为out参数有什么好处。
两种方法都很常见。但是,当函数返回一个int
结果代码时,它更容易成为线程安全的,并且API也更易于记录。
我建议使用以下方法:
示例:
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);
答案 1 :(得分:2)
如果要传播错误,请执行以下操作: 1.将返回类型设置为error / 0。然后按照第二种情况中列出的方法进行操作。 2.如果设置errno足以满足您的需要,那么在适当设置errno时如果情况变得严峻,您可能会坚持返回NULL。
您唯一需要坚持的是通过API以相同的方式进行操作,并且可以始终表示错误并以相同的方式进行操作。