2012-05-14 4 views
11

私はソフトウェアプロジェクト用のCライブラリを作成しています。私はいくつかのエラー報告をする必要がありますが、自分自身の複雑なエラーコード、変数、関数を実装するのは少し怠惰です。カスタムエラー報告のためにlibcが提供するerrno機能を使用することは許容されますか?私のすべてのエラーは、E...マクロによって与えられたカテゴリに収まります。アプリケーション/ライブラリエラーの報告にerrnoを使用

たとえば、私のコードに16進表記のSHA256ハッシュを読み込んでそれを何らかの内部形式に変換する関数があるとします。もちろん

#include <errno.h> 

int hash_fromstr(hash_t *out, const char *in) { 
    /* ... */ 

    if (strlen(in) != 65) { 
    errno = EINVAL; 
    return -1; 
    } 

    /* ... */ 
} 

この例では、実際にはるかにエラーが他の機能に起こることがあり、途方もなく単純化している:私は、エラーを報告するerrnoを使用したいです。

+0

あなたのライブラリにリンクするユーザアプリケーションの他の部分で、 'errno'の適切な機能を損なうことなく、あなたのライブラリが標準エラーコードを出すことができれば、問題はありません。おそらく、あなたは 'errno'変数を使用するかもしれませんが、それを変更せず、そのコピーを返すでしょうか? – Chimera

+0

@Jimライブラリ自体の内部で発生するエラーに対して 'errno'を使用したいと思います。ライブラリによって呼び出されるlibcの関数である必要はありません。 – fuz

+1

ライブラリの呼び出し元にエラーを報告するために 'errno'の値を設定しても問題ないのですか?もしそうなら、http://stackoverflow.com/questions/9856822/should-i-set-errno – Chimera

答えて

2

多くの人がこの無味料と考えています。まず第一に、パターンはあなた自身の変数を作ることです。具体的な値の範囲はあなたの問題に合わせて調整されます。第二に、スレッドの安全性の問題があります。これはトリッキーによってerrnoのために処理されます。

ステータス値を受け取るためにすべての関数にint*を追加したくないのですか?

+11

あなたが言う最後の選択肢は、非常に醜いと騒々しいです。ライブラリのユーザーがすべての関数に余分な引数を追加することは望ましくありません。 IMHOのエラー処理は、可能な限り不可視でありながら強力でなければなりません。 – fuz

+0

次に、Cよりも基本的ではないプログラミング言語を考えたいかもしれません。 – bmargulies

+1

@bmargulies:私のようなものであれば、個々の貢献者ではなく上級管理チームによって言語が選択されます。 – dreamlax

4

あなたが望むように、あなたのライブラリコードがerrnoが設定されていないことを確認してから、ライブラリコードがerrnoを設定する内部標準エラーを正しく検出できるようにしてください。詳細については、"should I set errno"もご覧ください。

0

はい、あなたはそれを変更することができ、スレッドスコープがあります。これは、そのような種類のエラー処理では非常に望ましいものです。

errnoエラーファミリ(E...)を使用して拡張しても、非常に強力で簡単なエラー処理パターンになることがあります。他の人が悪い味のアプローチと見なすかもしれませんが、IMHOはエラー処理のためのより洗練されたコードと標準化されたパターンを生成します。

+0

'errno'をどのように拡張できますか?私が知る限り、どの 'errno'値が割り当てられていないかを知るための移植可能な方法はなく、あなたが行ったとしても、同じことをしようとする他のライブラリと競合します。 – fuz

+0

@FUZxxlどの値が割り当てられていないのか知ることはできませんが、int型の範囲は安全なマージンに対応するのに十分です。競合については、errno値には単一の関数呼び出しのスコープしかないことを考慮すると、競合は起こりません。したがって、ライブラリによっては、エラーはライブラリエラーリストに対してのみ処理され、競合は回避されます。同意しますか? –

+0

@faniカスタムのものに 'errno'を使うと、' strerror'のようなものが壊れてしまいます。カスタムの 'errno'値は、失敗したライブラリ呼び出しの後に残り、潜在的に外部処理を邪魔します。 – fuz