C

カンマ・オペレータ

C

これは使えそう。 Comma operator - Wikipedia x = (a, b); y = (a, b, c); っていう処理があった場合、xにはaの処理をした後にbがxに代入される。 同じくyには、aとbの処理がされた後にcがyに代入される。 int x; int a=0, b=1, c=2; x = (printf("a=%d \n"…

マクロをdo-while(0)で囲むワケ

C

こんな感じで書かれたマクロを見ることがある。 #define SWAP(x, y) do { int temp = x; x = y; y = temp; } while(0) do-while(0)で囲んでいるのは、ブロックで囲まれていないif文での意図しない動作を防ぐため。 例えば、以下の場合に有効。 /* do-while(0…

関数ポインタで型情報の異なる関数を実行する -引数省略-

C

これ、知らなかった。‚b‚ł͈ø”È—ª‚̊֐”’è‹`fnc( )‚Ífnc(void)‚Å‚È‚­fnc(...) C言語において int fnc( ) という引数を省略した表現は、 int fnc(...) という、引数がいくつあってもよい、という意味になる ... が省略されている状態であって int fnc(voi…

構造体の不完全型宣言でメンバを隠蔽する

C

C言語で、あるモジュールを制御するような構造体があるとする。 どの制御を行うかの選択は上位モジュールに行わせたいが、制御で使用する構造体のメンバは見せたくない、といった場合、構造体の不完全型宣言で解決できる。 以下に等比数列・等差数列を計算す…

関数ポインタで型情報の異なる関数を実行する -キャスト-

C

C言語の関数ポインタは振る舞いを動的に変えるのに便利。 だけど、関数の型情報に縛られるのは何とかできないかと調べていたら、関数ポインタをキャストしてしまえば、どんな型の関数でも実行できることを知った。 ポインタ虎の巻〜関数ポインタの使い方 #in…