#gcc GNU C 拡張を気が向いたらメモる(´・ω・`)
注
・正しいことは保証しない
・場合によってはちょこちょこ更新する。
##ブロック文(複文)を式として評価
({宣言 または 文; ... 文;})
最後の文が式として評価される。
このブロック文内の式の評価は一度だけ。マクロにして安心。
ブロック内の文は定数式、ビット・フィールド、初期化された静的変数は使えない。
例:
int f(int a) { return a; }
int ret = f( ({int x=0; ++x; x;}) );
マクロとして利用できるだろう。
次の typeof と合わせて使うと(・∀・)イイ!!
また、式と評価されるので関数呼び出しにも使える。
関数呼び出しに渡す場合、式として評価させるため三項演算子を利用することがある。
printf("%d %s\n", count > 0 ? count : 0, " hit(s)");
上の文は次のように書き換えられる。
int hit;
....
printf( ({int count=hit; count>0 ? "%d %s\n", count, "hits" : "%s\n", "no hit";}) );
非常にわかりにくい。
しかし対応するオブジェクトがなくとも、スタックを用意するフォーマット指定子が選択的になった。
また、 count のスコープは制限されている。
##typeof
typeof( 式 または 型 )
typedef に似てる。
typedef は別名を付けるのに対し、こちらは新しい宣言子のように使える。
int _x;
typeof(_x) x;
#define Type(typename) typeof(typename)
#define Pointer(T) typeof(T *)
Type(int) x = 0;
Pointer(int) p = &x;
つづく?
GNU C 拡張機能
https://gcc.gnu.org/onlinedocs/gcc-4.8.3/gcc/C-Extensions.html#C-Extensions
GNU C モジュール・リスト
http://www.gnu.org/software/gnulib/MODULES.html
GNU C データ型・インデックス
http://www.gnu.org/software/libc/manual/html_node/Type-Index.html#Type-Index
GNU C コンセプト・インデックス
http://www.gnu.org/software/libc/manual/html_node/Concept-Index.html#Concept-Index