次の宣言でstruct
のインスタンスを返す関数があるとします。
struct data API(void)
;
また、実行中に関数がエラーで失敗する可能性があるとします。エラーが発生したことを示す最良の方法は何ですか?
頭に浮かぶ解決策は、次のように、終了ステータスとともに実際のデータ構造をネストする構造を作成することです。
_struct result {
signed int exit;
struct data;
}
_
関数宣言を次のように変更します。
struct result API(void);
これを行うより良い方法はありますか?私は、議論によって指摘された構造への書き込みの事実上の標準をよく知っています。 int API(struct data *location)
。
私たちは何が最良の方法であるかについて長い間議論することができますが、真実はあなたがそれと一致している限り何でもうまくいくということです。
あなたの解決策には大きな欠点があります:あなたが持っている構造ごとに1つの追加の構造が必要です。小さなアプリケーションではうまく機能するかもしれませんが、あまりうまく拡張できません。
オプションは、(コーディング標準によって)各構造にメンバーvalid
またはerror
を含めることを強制することです。これは、オブジェクトが有効な状態にあるかどうか、または最後にエラーが発生したかどうかを示しますオブジェクトの処理。良い知らせは、このルールの後にすべての構造が続くことを確認する構文アナライザーを作成できる可能性があることです。
C関数からエラーを通知する3つの方法を知っています。
すべての関数がエラーコードを返します。関数がデータ(たとえば、I/O操作の結果)を返す必要がある場合は、パラメーターによって提供されるポインターにデータを書き込みます。
[これは、O.P。が言及した事実上の標準です。]
関数はそのエラーをグローバルエラー変数に書き込みます。エラー変数は、呼び出し元のコードでよく知られています(アプリオリわかっています)。関数はデータ(またはvoid)を返します。呼び出しコードは、グローバル変数をチェックします。
この関数は、エラー情報とデータの両方を含む構造体を返します。
これらのスキームはすべて、即時呼び出しコードのエラーをチェックする負担をかけます。 C言語は、C++が例外を処理するようなエラーコードを処理しません。
いくつかの選択肢:a。関数は成功またはエラーコードのブール値を返し、ポインターパラメーターを介して構造体を返します。 b。関数が構造体を返し、ポインタパラメータを介してブール値またはエラーコードを返します。 c。有効性をチェックできる構造を返します。
個人的に私は好む。他の言語では、例外またはオプションがあります。 Swift 5.0は、この正確な目的のために、標準ライブラリに「結果」というタイプがあります。