错误码管理

该模块用于生成错误返回值。该模块可以生成一个int型错误码,用来定位错误文件、错误行数以及错误类型。

其中,32位 int 中,8位用于表示错误码,14位表示行数,9位表示文件名下标。即,该int型值的使用限制为:

  • 支持255个错误码(0xff为表留值)
  • 支持每个文件16383行(0x3ffff为保留值)
  • 支持511个文件(0x1ff为保留值)
  • 仅针对文件名,而非文件路径名,因此应尽量避免不同目录下出现同名代码文件

超出该限制的情况下,程序并不会发生异常或者报错,而是会报出Unknown ...的错误,可以参考本章最后一小节的示例。

头文件

#include "mln_error.h"

模块名

error

函数/宏

mln_error_init

void mln_error_init(mln_string_t *filenames, mln_string_t *errmsgs, mln_size_t nfile, mln_size_t nmsg);

描述:为错误码模块进行初始化,需要注意,文件和错误信息的顺序很重要,因为后续生成的返回值都将依赖这一顺序的下标。

  • filenamesmln_string_t类型数组,数组中每个元素都是一个文件名
  • errmsgsmln_string_t类型数组,数组中每个元素都是一个错误信息
  • nfile是文件名个数
  • nmsg是错误信息个数 注意filenameserrmsgs中的每一个mln_string_t元素的data指针内容都要以\0结束。这意味着你必须使用mln_string.h中的函数或者宏来创建该数组。一个最简单且常用的例子就是下面的示例。

返回值:无

RET

RET(code)

描述:根据给定的错误码code生成返回值。如果code为0,则表示无错。若code小于0则是不合法的错误值。若code大于0,则表示一个合法错误码。如果再此之前使用了mln_error_callback_set设置了回调函数,那么在返回值拼装完成后,回调函数会被调用。

返回值:0或一个负值,0表示无错误,负值表示出错。msvc环境下,返回值将直接赋值给参数code,而不是像函数一样返回。

CODE

CODE(r)

描述:根据返回值r,获取其对应的错误码。其中,rRET宏生成的返回值。

返回值:大于等于0的错误码

mln_error_string

char *mln_error_string(int err, void *buf, mln_size_t len);

描述:将返回值err翻译成字符串,并放入由buflen指定的缓冲区中。

返回值:错误信息,buf的首地址。

mln_error_callback_set

void mln_error_callback_set(mln_error_cb_t cb, void *udata);

描述:设置一个回调函数和用户定义数据到这个模块的全局变量中,这个回调函数会在RET宏中,在返回值拼装完成后被调用。 返回值:无

示例

#include "mln_error.h"

#define OK    0 //0是个特殊值,表示一切正常,由0生成的返回值就是0,不会增加额外信息
#define NMEM  1 //由使用者自行定义,但顺序必须与errs数组给出的错误信息顺序一致

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]

results matching ""

    No results matching ""