int 型返回值所能表达的内容极限

217 天前
 monkeyNik

以前开发的时候经常遇到对外暴露的函数需要提供一些返回值,来表达函数是否出错。

但有时候一个函数可能出现多种错误,所以单纯返回-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 的官方文档了解详情。

958 次点击
所在节点    C
2 条回复
nightwitch
216 天前
还有一种做法(OpenGL/Vulkan)就是允许用户注册一个回调函数来处理错误,在回调函数的参数里把需要的信息传过去就行了。
monkeyNik
216 天前
@nightwitch 这也是个思路,可以在回调函数里面对一些特定位置的特定错误做一些特殊处理。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/979065

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX