如何在代码块中设置样式或避免多个函数返回检查

时间:2012-04-13 18:08:27

标签: c design-patterns coding-style

在我的代码中很多次我都有这样的块:

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");

但我认为这不是一个很好的方法。对此有什么好的解决方案?

2 个答案:

答案 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

我认为其他答案中建议的每个功能的宏更清晰。也许有人有更好的解决方案,但现在这就是我将要使用的。