[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
複文を小括弧で囲むと、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)) |
しかし、この定義は a か b のどちらかを二回評価してしまい、
引数が副作用を持つ場合は予期しない結果を生じる。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.