[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.1 式中の文と宣言

複文を小括弧で囲むと、GNU C では式として使用できる。これにより、式の中で ループや switch 文や局所変数を使用できる。

さて、複文とは中括弧で囲まれた文の列であった。この拡張構文では、 中括弧のまわりを小括弧が囲むことになる。例えば、

 
({ int y = foo (); int z;
   if (y > 0) z = y;
   else z = - y;
   z; })

は、foo () の絶対値を取る正しい式である。 (必要以上に複雑だが。)

複文の最後には、セミコロン付きの式を置く必要がある。この最後の式の 値が複文全体の値の役割を果たす。 (中括弧の最後に他の種類の文を使うと、複文全体の型は void になり、 有効な値を持たないことになる。

この機能は、マクロを安全に定義する場合に特に有効である。 安全にというのは、マクロの引数の評価を一度だけ行うように出来る という意味である。例えば、最大値を取る関数は、標準規格 C のマクロとして 以下のように定義するのが普通である。

 
#define max(a,b) ((a) > (b) ? (a) : (b))

しかし、この定義は ab のどちらかを二回評価してしまい、 引数が副作用を持つ場合は予期しない結果を生じる。GNU C では、 引数の型を知っていれば、マクロを安全に定義できる。 int 型の場合は以下のようになる。

 
#define maxint(a,b) \
  ({int _a = (a), _b = (b); _a > _b ? _a : _b; })

複文式は、定数式が要求される場面では使えない。例えば、 列挙定数の値や、ビットフィールドの幅、静的変数の初期値等には 使えない。

引数の型が判らない場合でも、typeof (see section typeof による型の参照) または 型名付 を使うことによって、上記の手法が使用可能である。


This document was generated using texi2html 1.78.