对于我的系统编程类,我们在 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: 我们的功能错误(我相信在这种情况下),需要处理。仅需要提供通知。我们没有涉及处理与线程/进程相关的错误(简而言之就是这个主题)。
答案 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()
,这可能适合作业,但在真实世界的程序中你不想这样做。