5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GNU コンパイラ・コレクション C言語拡張

Last updated at Posted at 2014-12-27

#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

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?