在我的代码中很多次我都有这样的块:
close(READ);
dup(fd[READ]);
close(fd[READ]);
execl("ay", "bee", NULL);
我怎样才能避免一堆
if (close(READ) == -1) {
perror("close");
exit(EXIT_FAILURE);
}
...repeat for each function...
或者处理这个问题的好习惯是什么?
我试过这样的事情:
void test_returns(int result, char * err) {
if (result == -1) {
perror(err);
exit(EXIT_FAILURE);
}
}
/* code */
test_returns(close(READ), "close");
test_returns(dup(fd[READ]), "dup");
test_returns(close(fd[READ]), "close");
test_returns(execl("ay", "bee", NULL), "execl");
但我认为这不是一个很好的方法。对此有什么好的解决方案?
答案 0 :(得分:0)
如上所述,您的test_returns函数无法解决问题,因为您仍然会将错误检查代码与业务逻辑混合在一起。你应该更进一步:
void test_returns (int result, char * err) {
if (result == -1) {
perror(err);
exit(EXIT_FAILURE);
}
}
void CLOSE (int fd) { test_returns(close(fd), "close"); }
void DUP (int fd) { test_returns(dup(fd), "dup"); }
#define EXECL(path, arg, ...) do { test_returns(execl(path, arg, __VA_ARGS__), "execl"); } while (0)
然后你编写这样的代码:
CLOSE(READ);
DUP(fd[READ]);
CLOSE(fd[READ]);
EXECL("ay", "bee", NULL);
这更具可读性。现在,考虑到test_returns的简单性,您可能希望将其直接集成到各种包装器中。这是一个偏好的问题。
答案 1 :(得分:0)
到目前为止,这个问题的最佳解决方案是偶然遇到的:http://c.learncodethehardway.org/book/learn-c-the-hard-waych21.html#x26-10500021
我认为其他答案中建议的每个功能的宏更清晰。也许有人有更好的解决方案,但现在这就是我将要使用的。