0

これはCでのNULLの有効な使用でしょうか、それともこの問題を解決するために推奨される他の方法がありますか?

// Send data
// cb_push returns NULL if it is successful
char uart_send(char c) {
    void* ret = cb_push(w_buffer, &c);
    if (ret != NULL) return c;

    SETBIT(UCSR0B, UDRIE0);
    return NULL;
}

Javaではこういうことをしたいのですが、CIでは何が良い習慣かわかりません。

4

3 に答える 3

2

これは実際には定義されておらず、使用しているライブラリや関数に応じてさまざまなアプローチがあります。0一般に、とを区別する方法はありませんNULL(実際、NULL通常はプリプロセッサマクロがに展開され0ます)。

一般に、次の可能性が使用されますが、使用法によっては1つのライブラリ内で一致する場合もあります。

  • ポインタが返される場合、0通常、の戻り値はある種のエラーを示します。
  • ステータスコード(またはmainエントリポイント)を持つ関数は、通常0、エラーが発生していない場合に戻ります。
  • 0何かが成功しなかった場合に返される関数があります(つまり、ブール値を返します)。
  • 一部のstdlib文字列関数は、エラーが発生した場合(または何も見つからなかった場合)に「ばかげた」値を返します。たとえば、サブ文字列が見つからなかった場合はstd::string::find()を返します。ただし、これは、「魔法の値」を回避するために、-1値()という名前の定数の後ろにラップ/非表示になっています。std::string::npos

完璧な方法はありますか?私はそうは思いませんが、それは実際には特定のユースケースに依存します。ポインタを返す場合、間違いがあった場合に0を返すのは完璧です。ステータスコードを返す場合は、マクロ(Windows APIと同様)または列挙型のいずれかを使用します。特定の値についても心配する必要はありません。名前のみを使用してください。

于 2012-10-29T22:02:13.503 に答える
0

一般的に、Cの規則では、成功した場合は0を返し、そうでない場合は負の数を返します。

また、関数が何らかのポインタを返すことになっていて、それが失敗したと仮定すると、規則はNULLを返すことです。

于 2012-10-29T21:53:08.950 に答える
-1

NULLは#define NULL (void*)0、メモリの0番目の場所を指すポインタを意味するものとして内部的に定義されています。

于 2019-09-06T12:52:02.867 に答える