以前开发的时候经常遇到对外暴露的函数需要提供一些返回值,来表达函数是否出错。
但有时候一个函数可能出现多种错误,所以单纯返回-1 也无法满足需要。有些人的处理方式是增加一个 errno 来标记错误。
但个人感觉还是有些麻烦,而且需要考虑多线程问题。
所以实现了这样一个返回值管理的组件放到了 Melon 库中。
先给出一个例子,大家看看效果吧。
#include "mln_error.h"
#define OK 0
#define NMEM 1
int main(void)
{
char msg[1024];
mln_string_t files[] = {
mln_string("a.c"),
};
mln_string_t errs[] = {
mln_string("Success"),
mln_string("No memory"),
};
mln_error_init(files, errs, sizeof(files)/sizeof(mln_string_t), sizeof(errs)/sizeof(mln_string_t));
printf("%x %d [%s]\n", RET(OK), CODE(RET(OK)), mln_error_string(RET(OK), msg, sizeof(msg)));
printf("%x %d [%s]\n", RET(NMEM), CODE(RET(NMEM)), mln_error_string(RET(NMEM), msg, sizeof(msg)));
printf("%x %d [%s]\n", RET(2), CODE(RET(2)), mln_error_string(RET(2), msg, sizeof(msg)));
printf("%x %d [%s]\n", RET(0xff), CODE(RET(0xff)), mln_error_string(RET(0xff), msg, sizeof(msg)));
return 0;
}
这个程序的执行结果如下:
0 0 [Success]
ffffedff 1 [a.c:18:No memory]
ffffec01 255 [a.c:19:Unknown Code]
ffffeb01 255 [a.c:20:Unknown Code]
可以看到,通过一个 int 值,我可以获取到错误码、文件、行号甚至是错误码对应的描述。
当然这些内容需要在返回值管理组件初始化的时候给出。
这样,每一份代码的每一个使用RET
生成的错误码将是全项目中独一无二的一个负整数。只要有了这个负整数,同时知道了代码的版本,就可以轻松获取到错误的位置和错误内容。
感兴趣的可以看一下Melon 的官方文档了解详情。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.