yas@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> ということなのでしょう。それで、 a.h, b.h には、でも、struct 
> 本体は、書かないで隠したくなるんだけどなあ。a.c, b.c の方に
> 定義して。

賛成。

学生に教え込むんなら、もう、全部 抽象データ型にさせちゃって、実装は隠
すことにしちゃうと、話が簡単になりませんかね。

    #define AbsType(type) typedef struct type##_impl *type

しておいて、

    #ifndef FOO_H
    #define FOO_H

    AbsType(foo);
    AbsType(bar);

    foo make_foo(void);
    void foo_bar_method(foo, bar);
    ...

    #endif

とか。んで、struct foo_impl の定義は foo.c にしか出てこない。
struct bar_impl の定義は bar.c にしか出てこない。

こうすれば、相互依存しててもあんまり気にする必要ないですよね。

(でも、全部 抽象データ型への参照で扱うと、GCが欲しくなる。
上のやりかただとgetter/setterもインラインに書けないし。
で、けっきょくJavaへ...)

kono@ie.u-ryukyu.ac.jp (Shinji KONO) writes:

> Linux kernel 2.6 は、そのあたり、もうあきらめていて、
> 
>       すべてのファイルがinclude するのは、config.h だけ
> 
> で、config.hには、すべてのinclude file がflatに入っている
> っていう構造になっている...

1行変更しても、全部コンパイルし直しなんですよねえ。

> > #プリプロセッサーが自動チェックしてくれればいいんですが。
> 
> それでもいいんだけど...
> 
>     *.h を手で書かせるな
> 
> って気もかなりするんだよな。

Modula-2やAdaみたいな緊縛マゾ言語にしてガチガチにチェックするでもなし、
Javaみたいに依存関係を自動で見てくれるでもなし、中途半端ですよねえ。

                                前田敦司