如何从错误处理和调试中减少C中的代码膨胀

Ake*_*eel 6 c readability code-readability

考虑这个功能:

int get_result(int *result) {
     int err = 0;
     int number = 0;         

     if (result == NULL) {
         printf("error: null input\n");
         return -1;
     }

     err = get_number(&number);

     if (err != 0) {
         printf("error calling get_number: err = %d\n", err);
         return err;
     }

     err = calculate_result(number, result);

     if (err != 0) {
        printf("error calling get_result: err = %d\n", err);
        return err;
     }

     return err;
}
Run Code Online (Sandbox Code Playgroud)

这个函数的实际工作只需要3行(声明数字变量,调用get_number(),然后调用calculate_result()).但是,错误检查/处理代码会将此功能扩展为17行(给定或接受,具体取决于您对行的计算方式).

在更大规模,多次调用和多次错误检查时,我们完全膨胀该函数并使其难以理解且难以理解.

有什么方法可以解决C代码膨胀问题并保持函数核心操作的可读性(不牺牲基本的错误处理代码)?

小智 0

这是异常的主要原因,但我必须承认我不喜欢在使用显式内存管理的语言中引入异常,因此这个答案可能有偏见。也就是说,有一些常见的策略可以将中的业务逻辑与错误处理分开。

  1. 使用异常 - 看看longjmp()/在setjmp()中自己实现它们。我建议不要这么做。
  2. 如果发生错误时需要进行清理,请将其放在函数的末尾goto。(对真的!)
  3. 要检查返回值并将消息打印到stderr,请尝试排除常见情况并定义宏,例如在您的情况下:

    #define CHECK_RETVAL(val, action) do { \
        if (val < 0) { \
            fprintf(stderr, "error calling " action ": %s\n", strerror((val))); \
            goto error_cleanup; \
        }} while (0)
    
    Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

225 次

最近记录:

10 年,2 月 前