5

私は次のcコードを持っています:

#define ASSERT_ACTIVE(active) do { if (!active) return errno = 6, -1; } while (0);
#define errno (*_errno())

int someCrazyFunc (bool active) {
    ASSERT_INACTIVE (active);
    ...
}

私の知る限り#define、指定された識別子の代わりに置換テキストを配置するだけです。

私は知りたい:

  • とはどういうreturn errno = 6, -1;意味ですか? 1 つの return ステートメントで 2 つの値を返すということですか?
  • 交換コードの意味は何ですか(*_errno()) = 6
4

2 に答える 2

9

2番目の値はありません-returnステートメントは正確に1つの値を返します。声明の中で:

return errno = 6, -1;

戻り値は、式の結果ですerrno = 6, -1。これは、コンマ演算子を使用した式です。これは、として解析され、副作用として(errno = 6), -1評価され-1、に割り当て6られます。errnoつまり、これは2つのステートメントと同等であることを意味します。

errno = 6;
return -1;

_errno()それがポインタを返す関数であると仮定すると(たとえば、戻りタイプがint *)、式は関数の戻り値が指すオブジェクト(*_errno()) = 6に値を割り当てます。6これは、次のようなコードと同等です。

int *p = _errno();
*p = 6;

errnoマルチスレッド実装の各スレッドに独自のを与えるために、このように定義されることがよくありますerrno。この場合の関数_errno()は、現在のスレッドのerrno変数へのポインターを返します。

于 2012-10-24T02:15:31.867 に答える
1

これは実際にはreturnステートメントの2番目の値ではなく、コンマ演算子です。カンマの両側の式を評価しますが、2番目の式の値のみを「返します」。

つまり、式を個別にreturn errno = 6, -1;評価してから、2番目の式の結果を返します。これは。によって使用されます。errno = 6-1-1return

于 2012-10-24T02:15:02.990 に答える