1

まず第一に、私は UNIX ライクなシステムについて話しています。

Mac OS、Linux、Minix、および K&R C ブックで「FILE」構造体の定義を調べましたが、それらはすべて異なっています。

K&R Cの本では、それは非常に明確です

typedef struct _iobuf{
    int cnt;
    char *ptr;
    char *base;
    int  flag;
    int  fd;
} FILE;

Mac OS では、構造体内により多くのものがあります。

Linux (3.0) では、

typedef _IO_FILE FILE;

ヘッダーには、「C++ iostream の上に ISO C stdio を定義する」と記載されています。エム... ? ( Linux の C は C++ で実装されている? 逆じゃない?) _IO_FILE の定義は libio.h にあるらしい

Minix では、定義は K&R と非常に似ています。

私の理解では、stdio.h は C の一部であるべきでした。最初の C コンパイラは、アセンブリ言語によって実装されました。また、C は OS の種類に依存しない必要があります。

ハードウェア上のマシンコード -> asm -> C -> より複雑な C -> UNIX

そして今、さまざまな OS (すべての種類の UNIX) にさまざまな stdio.h があり、コンパイラはすべて gcc です。

これを理解する方法は?

どうもありがとう、アルフレッド

4

2 に答える 2

5

FILE構造体はプラットフォームに依存し、そのフィールドは C ライブラリによって内部的に使用されます。中身に頼ってはいけません。

于 2011-08-28T05:38:46.853 に答える
1

独自の C コードは OS に依存すべきではありません。C ヘッダーと内部 CRT 実装は OS に依存します。クロスプラットフォーム プログラミングの意味: コードを記述し、異なる OS でコンパイルすると、動作するはずです。ただし、基盤となるツール (C、クロスプラットフォーム ライブラリ) は OS 固有の API とやり取りしており、OS ごとに異なります。

もちろん、不透明な構造のフィールドを使用しないでください。これにより、プラットフォームに依存しないコードが壊れます。

于 2011-08-28T05:40:31.330 に答える