memo/20051226
created 2005-12-26 modified 2006-01-31
gcc 4.0 cast-as-lvalue の削除
別のホストでコンパイルしたらエラーとなってしばらく悩んだ。void *vp = なにか; Hoge *hoge; (void *)hoge = vp;というようなコードは厳密には言語規則に違反していて、cast-as-lvalue という gcc の独自拡張機能のおかげでコンパイルできていたそうな。
hoge = (Hoge *)vp;は当然可だけど、 Hoge, Fuga 共通のマクロの処理なので void * を使いたい、といったところ。
ホントはね...あれやこれや...
gcc 4.0 でこの独自拡張機能が削除されてしまって、そんな殺生な、という議論が各所であるらしい。
でもアレだ。自分が字句解析処理や意味解析処理の実装担当者だったら、
言語設計者が想定していない文法をOKにするなんて「一切おことわり」だよな。
確かに。
続き(2006/1/31)
抜け道発見。(void *)hoge = vp;はダメだけど、
*(void **)&hoge = vp;はOK。
なんだかなぁ。
ソフトの構造を考えていて
パケット処理のプログラムって、ある程度抽象的にやろうとすると結局、ベルトコンベアみたいに各作業者がいる流れ作業の川をパケットが通過していく、
という形になるっぽい。