send
とrecv
に類似したインターフェースをエクスポートするモジュールを書いています。
これらの関数はそれぞれ送信バイト数と受信バイト数を返すことになっているため、通常のように(つまり、列挙型を使用してニーモニック値を返す)、適切なエラー管理を行うことができません。
このような状況では、標準ライブラリのようにerrno
を設定する必要がありますか?もしそうなら、errno
はスレッド固有なので、それに書き込む特定の方法はありますか、それとも単に値を割り当てることができますか?
編集:実験割り当てによるerrno
の設定が機能していることに気付きました。それでも:これはどのシステムでも安全で移植可能ですか?
これは少し古いですが、 errno-マニュアルセクション は、マクロであっても直接割り当てることができ、スレッドローカルになることを示しています
設定できるのはだけではありませんerrno
を設定できますが、多くの場合、すべきですerrno
。一部のライブラリ関数を呼び出すとき、errno
を最初にゼロに設定した場合にのみ確実にエラーを検出できます。 例についてはstrtol
を参照 。
strtol
のPOSIX仕様から:
[CX] [オプションの開始] strtol()関数は、成功した場合、errnoの設定を変更しません。
0、{LONG_MIN}または{LLONG_MIN}、および{LONG_MAX}または{LLONG_MAX}は、エラーの場合に返され、成功の場合は有効な戻り値であるため、エラー状況を確認するアプリケーションは、errnoを0に設定してから、strtol()を呼び出す必要があります。またはstrtoll()の場合、errnoを確認してください。 【オプション終了】
実際、int
が返されるため、おそらくcanは(適切に)エラー管理を実行します。
読み取るまたは書き込むバイト数には負でない値を使用し、エラーコードには負の値を使用してください。あなたはhaveを自分自身を-1
に制限することはしません:
enum myerrors {
ERR_NO_MEMORY = -1,
ERR_BAD_ARGS = -2,
ERR_CPU_EXPLODED = -3,
// and so on
};
ただし、errno
を希望どおりに設定することは有効です。標準では、errno
は変更可能な左辺値に展開する、つまりユーザーが設定できることを示しています。 C1x/n1425, 7.5 Errors <errno.h>
から:
...および
errno
は、int型の変更可能な左辺値に展開され、その値は、いくつかのライブラリ関数によって正のエラー番号に設定されます。
errno
に値を割り当てるだけですが、状況によってはより適切なエラーを通知する他の方法があることに注意してください。
int *
(またはsize_t *
または使用するもの)で指定します。その後、エラーコードを返すことができます。差出人: http://support.sas.com/documentation/onlinedoc/sasc/doc700/html/lr1/errno.htm
errno
の移植可能な値は、EDOM
とERANGE
のみです。
これで、移植性に関する質問に答えることができます。
はい、あなたはそれに割り当てることができます、そしてはい、割り当てはスレッドセーフになります。参照 errnoはスレッドセーフですか?