過去ログ
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にしろ目的は実装の隠蔽ですから,
>中身に触らないのが一番だと思います。
内臓を見せるべきでないのに
あえて見せているのが何故なのか・・・気になったしだいです。
#物見には内臓に触る勇気も技も小ネタもありません。
ありがとうございました。