2

今日、私は C の標準 I/O について学んでいます。stdio.h ファイルを開くと、次のことがわかりました。

typedef struct _iobuf FILE;

構造体 _iobuf の定義を確認すると、次のことがわかりました。

struct _iobuf {
    char *_ptr;
    int   _cnt;
    char *_base;
    int   _flag;
    int   _file;
    int   _charbuf;
    int   _bufsiz;
    char *_tmpfname;
};

より理解を深めるために、それぞれの禁止事項について、正しいかどうかを説明しました。

struct _iobuf {
    char *_ptr;      /* next character position */
    int   _cnt;      /* characters left */
    char *_base;     /* location of buffer */
    int   _flag;     /* File status flags */
    int   _file;
    int   _charbuf;   /*Data transfer buffer */
    int   _bufsiz;    /* Buffer size */
    char *_tmpfname;  /* Temporary file indicator */
};

今、私の心に2つの質問がありますか?

Q1: I/O で正しい名前とどのように構造が役立つかを提供しましたか? 何かを追加または削除するとどうなりますか? それはそれに応じて機能しますか?ここで提供される順序は重要ですか?

Q2: ここではポインタは使用されていませんが、ファイルを開くために FILE * を使用するのはなぜですか?

4

3 に答える 3

5

正しい名前を入力しましたか?

これらはすべて、Microsoft の実装に固有の内部の詳細であり、AFAIK では文書化されていません。

何かを追加または削除するとどうなりますか?

それは本当に悪いことです。おそらく未定義の動作を引き起こしているでしょう。

ここではポインタは使用されていませんが、ファイルを開くために FILE * を使用するのはなぜですか?

アプリケーション コードの観点からは、実装の詳細は重要ではないためです。不透明なポインターFILE *を意図しています。

于 2013-02-17T12:57:04.750 に答える
4

A1. 標準ヘッダーを編集すると、未定義の動作が発生します。

A2. 構造体は通常、C ではコピーを避けるためにポインターとして渡されます。また、ハンドルまたは不透明なポインターとして機能することを意図しています。

より大きな問題は、なぜあなたが求めていることをしたいのかということです。

于 2013-02-17T12:58:21.423 に答える
0

すべての質問への回答:

PJ Plauger による標準 C ライブラリ

于 2013-02-17T15:51:03.713 に答える