C错误检查功能

时间:2010-09-14 00:52:05

标签: c error-handling macros c-preprocessor variadic-functions

对于我的系统编程类,我们在 C 中进行了大量编程,并且需要对大多数函数进行错误检查,因为我们正在学习使用pthread编程。

我之所以说这不是真正的功课,是因为它远远超出了本课程的预期。简单地单独检查每个功能是令人满意的。我觉得这是一个耗时且麻烦的方法,希望能有一个更简洁的解决方案。

我想知道是否有人可以告诉我如何编写一个函数,该函数将 C 函数作为参数,然后是该函数的所有必需参数,以及所需的返回值(in这种情况是正确的),并执行以下操作。

if(function_name(param1, param2, ...) != desired_return_value) {
    fprintf(stderr, "program_name: function_name() failed\n");
    perror("function_name(): ");
}

这可能吗?我们的课程几乎不需要它,但它让我感到烦恼的是,我写的几乎所有函数都必须有4行代码才能对其进行错误检查。它让人难以阅读。

即使是其他一些建议也会很好。我只是想提高可读性,所以如果这是完全错误的方向,那么一些正确的方向将非常受欢迎。

编辑:这应该理想地在gnu99标准下编译:P

编辑2 :回应James McNellis: 我们的功能错误(我相信在这种情况下),需要处理。仅需要提供通知。我们没有涉及处理与线程/进程相关的错误(简而言之就是这个主题)。

1 个答案:

答案 0 :(得分:13)

在不使用宏的情况下在C中编写通用代码并不是最简单的事情。

对于使用可变参数宏的(非常)基本解决方案:

#define CALL_AND_CHECK(f, r, ...)                                \
    do {                                                         \
        if (f(__VA_ARGS__) != r)                                 \
        {                                                        \
            fprintf(stderr, "program_name: " #f "() failed\n");  \
            perror(#f "(): ");                                   \
        }                                                        \
    } while (0)

(参见Why are there sometimes meaningless do/while and if/else statements in C and C++ macros?了解为什么使用“无意义的”do / while循环)

请注意,打印出错误消息而不是实际处理错误几乎肯定是个坏主意。通常,需要以不同方式处理不同的错误,因此这样的通用代码可能不是特别有用。如果你不想尝试从任何这些错误中恢复,你可以exit(),这可能适合作业,但在真实世界的程序中你不想这样做。