2012-04-13 9 views
1

たくさんのスタイルやコードのブロックで複数の関数の戻り値のチェックを回避するために、どのように私はこのようなブロックを持っている:私のコードでは倍の

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

通常、エラーが発生した場合すぐに終了するのではなく、現在の機能からエラーコードを返します。いずれの場合でも、 'if'を避けることはできません(マクロを除いて、これは本当に醜いことがあります)。 –

答えて

0

これまでにここに偶然遭遇したこの問題に対する最善の解決策:http://c.learncodethehardway.org/book/learn-c-the-hard-waych21.html#x26-10500021

私はそれが各関数のマクロは他の回答で示唆されているようにすることを非常にきれいだと思います。たぶん、誰かがより良い解決策を持っているかもしれませんが、今のところ、これは私が使っているものです。

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の単純さを考えれば、さまざまなラッパーに直接組み込むことができます。それは好みの問題です。

関連する問題