これを達成する方法は1つではありませんが、一般的な解決策は次のとおりです。
int find_uint32(uint8_t id, uint32_t *result)
関数に結果ではなくステータスコードを返すようにします。実際の結果は、ポインタを介して「返されます」。ここでは意見が異なりますが、次のようなことができるように、関数が失敗したときにゼロを返すようにすることをお勧めします。
if (!find_uint32(42, &out)) {
/* error */
}
逆の場合、つまり、ポインタパラメータを介してステータスコードを返し、その結果を関数の戻り値として返す理由の1つは、NULL
エラーを無視する場合にステータスコードを渡すことができるためです。そうすれば、何らかの理由でエラーを心配する必要がない場合でも、コードが読みやすくなります。検討:
uint32_t val = find_uint32(42, NULL /* don't care */);
場合によっては、エラーインジケータとして「魔法の値」を予約できます。あなたが言ったように、NULL
ポインタは文字列に対して機能します。ある整数値が決して有効な結果ではないことが確実な場合は、エラーを示すようにすることができます。たとえば、 0x7FFFFFFFを超えることのない符号なしの値を返す関数がある場合、31番目のビットにエラーを示し、残りの31ビットにデータまたはエラーコードを最初のビットの値に応じて運ぶことができます。
私は一般的にこの方法をお勧めしません。その理由は、魔法のエラー番号を使用すると、エラーフラグを明示的に返すよりも、コードの読み取りと保守が難しくなるためです。