V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
monkeyNik
V2EX  ›  C

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

  •  
  •   monkeyNik · 205 天前 · 941 次点击
    这是一个创建于 205 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    2 条回复    2023-10-06 19:54:54 +08:00
    nightwitch
        1
    nightwitch  
       204 天前
    还有一种做法(OpenGL/Vulkan)就是允许用户注册一个回调函数来处理错误,在回调函数的参数里把需要的信息传过去就行了。
    monkeyNik
        2
    monkeyNik  
    OP
       204 天前
    @nightwitch 这也是个思路,可以在回调函数里面对一些特定位置的特定错误做一些特殊处理。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   947 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:30 · PVG 03:30 · LAX 12:30 · JFK 15:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.