Protothreadsで学ぶC言語
いまだにC言語をよく理解していない。
1文しかない関数を定義する場合でもブロックは必須なのね。
例えばこういうのはダメ、と。
void test_func(void) return;
上記の問題は、
epollのチェック関数を作っているときに気づきました。
しかし、Linux 2.4君よ、
なぜepoll_createのダミーを置くのだ…
AC_CHECK_FUNCだけで調べられないじゃないか。
C言語といえば、
switch内のcaseが置ける場所について、
ブラジルの中でちょっと話題になった。
Duff's device - Wikipediaでも挙げられているとおり、
ブロックの中にもcaseが置ける。
caseはgotoのラベルのようなものということだな。
同様のテクニックは、Protothreadsでも使われている。
パッケージ内のlc-switch.hには以下のマクロが定義されていて、
継続っぽいことができるようになっている。
#define LC_INIT(s) s = 0; #define LC_RESUME(s) switch(s) { case 0: #define LC_SET(s) s = __LINE__; case __LINE__: #define LC_END(s) }
Protothreadsの欠点として
- スタック変数は使えない
- switchの中で継続ができない(gccの拡張を使えば回避可能。see:lc-addrlabels.h)
というのがあるが、適用範囲を間違えなければ使える。