C言語関係掲示板

過去ログ

No890 FILE型は何故内臓をさらけ出しているか

[戻る] [ホームページ]
No.476

FILE型
投稿者---物見遊山(2003/09/26 14:23:39)


なぜFILE型は
typedef struct __sFILE *FILE;
とtypedefしないで
typedef struct __sFILE FILE;
とtypedefして
struct __sFILEの内臓をさらけ出しているのでしょうか?
不完全型でも全然問題ないような気がするのですが・・・。

他にもGtk+のGtkWidget型もポインタ型でtypedefせず
実体でtypedefしています。

何か理由があるのでしょうか?

No.478

Re:FILE型
投稿者---YuO(2003/09/26 16:46:48)


>なぜFILE型は
>typedef struct __sFILE *FILE;
>とtypedefしないで
>typedef struct __sFILE FILE;
>とtypedefして
>struct __sFILEの内臓をさらけ出しているのでしょうか?
>不完全型でも全然問題ないような気がするのですが・・・。

typedef struct __sFILE FILE;
とした場合に,struct __sFILEの定義を記述する必要はありません。

struct __sFILEの定義が<stdio.h>なりに書かれているのは,
getcやputcといったマクロを効率よく定義可能にするためでしょう。

で,ポインタ型として定義されていないのは,
FILE *とした方が,利用者がポインタ型であると認識しやすいからでしょう。
#fopenの戻り値はNULL,つまりポインタです。


>他にもGtk+のGtkWidget型もポインタ型でtypedefせず
>実体でtypedefしています。

Gtk+は使ったことがないですが,
たぶん同じような理由だと思います。


基本的に,FILEにしろGtkWidgetにしろ目的は実装の隠蔽ですから,
中身に触らないのが一番だと思います。


No.479

Re:FILE型
投稿者---物見遊山(2003/09/26 17:01:51)


>struct __sFILEの定義が<stdio.h>なりに書かれているのは,
>getcやputcといったマクロを効率よく定義可能にするためでしょう。

あ。なるほど。関数でなくマクロでライブラリ関数が
実装されていることってありますね。

>で,ポインタ型として定義されていないのは,
>FILE *とした方が,利用者がポインタ型であると認識しやすいからでしょう。
>#fopenの戻り値はNULL,つまりポインタです。

確かに
if (fp == NULL)
って書きますね。
なるほど。

>基本的に,FILEにしろGtkWidgetにしろ目的は実装の隠蔽ですから,
>中身に触らないのが一番だと思います。

内臓を見せるべきでないのに
あえて見せているのが何故なのか・・・気になったしだいです。
#物見には内臓に触る勇気も技も小ネタもありません。

ありがとうございました。