- ベストアンサー
プログラミング言語C第2版 カーニハンリッチー
上記のタイトルの参考書で今、C言語の勉強をしています。 第8章のfopenを低水準入出力関数で実装する という項目に取り組んでいるのですが 参考書通りにコーディングしても _iod や OPEN_MAX が見つからないみたいなコメントが出てきて コンパイルができません。 どのヘッダファイルをインクルードすれば良いのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
う~ん……加えると……。 そもそもK&Rの第8章って「UNIXシステムインターフェース」ですよね。 と言うことは環境的にはある程度「UNIX依存」じゃないか、とも思えるのですが。 例えば、p215に次の記述があります。 「次に示す典型的なstdio.hからの抜粋では」 と書いてますね。この「典型的な」stdio.hに問題のOPEN_MAXや_iobがまず定義されているわけですけど……。この「典型」になってるのはオリジナルのUNIXのものですよね? ちなみに「んじゃあFreeBSDなんかのstdio.hはどうなんだ?」とか思って調べてみたわけですが、次のようになってる模様です。 free bsd stdio.h lang:c: http://www.google.co.jp/codesearch/p?hl=ja#XAzRy8oK4zA/libc/include/stdio.h&q=free%20bsd%20stdio.h%20lang:c これ見る限り、「似たような」コードではありますが……。ザーっと読む限り、K&Rで記述されているOPEN_MAXはFOPEN_MAXになっているようですし、また、_iobは__sFILEになってるんじゃないかな?多分。 つまり、使用している環境/コンパイラによって「変数の名称が違う」んですね。また、僕の使ってるLinuxでのgccのstdio.hも一応見てみたんですが、FreeBSD版と違って若干ゴチャゴチャしてましたが(笑)、やっぱり「違う」わけです。 つまり、「低水準入出力関数で実装する」以上、お使いのコンパイラでのヘッダーファイルの記述がどうなってんのか、熟知する必要があるのではないでしょうか? ないしは、UNIX使ってないんでしたら、この章は飛ばしても大丈夫なのかな、とかちょっと思いました(笑)。
その他の回答 (2)
- anmochi
- ベストアンサー率65% (1332/2045)
_iodは_iobの誤記かな。_iobもOPEN_MAXもあなたが定義するものですよ。 8.5の最初のプログラムリスト(※1)に #define OPEN_MAX 20 と extern FILE _iob[OPEN_MAX]; という行がありませんか? ここで定義ないしは宣言を行っています。 FILE *fopen(char *name, char *mode)のプログラムリストは※1が必要なのではないでしょうかね。私はここら辺は実習していないので正確にはわかりません。ただ、extern FILE _iob[OPEN_MAX]というのは変数宣言であって変数定義ではないので定義はまた別個にやってあげないとセグメンテーションフォールトが発生するかも知れません。 蛇足になりますが、もしあなたが必要にせまられてしょうがなしにこの本を読んでいるのではなく、C言語を本当に理解したいのでこの本で勉強をしているのであれば、1.10 外部変数と通用範囲、5章全部、6章全部をもう一度熟読される事をお勧めします。 また、付録A 参照マニュアルというのがあれば、それは一生使えます。Cウィザードになってもここはいつでも役に立つので何度でも読み返されると良いでしょう。
お礼
すみません_iodは誤記です。 え?? …これって/include/stdio.hの抜粋じゃないんですか? まぁ、確かに打ち込めば話は早いですね ですが、私としては、ライブラリの勉強がしたいのでstdio.hを見て探しました。 gccのstdio.hだと、変数名とか、宣言の場所がこの本と違うんで分からないんです。 たぶん、この本が出版されてからかなり経ってるので標準ライブラリの形が変わってしまってるんでしょうね。 その上で、現在ではどこにファイルのデータを扱ってる構造体宣言があるのかを聞きたかったのですが 言葉足らずだったみたいです また出直します ご回答ありがとうございました。
- tatsu99
- ベストアンサー率52% (391/751)
エラーになったソースを補足してください。 補足する際は、手で打ち込むのではなく、元のソースをコピーして貼り付けてください。手で打ち込むときに、打ち込み間違いがあり、そのため、期待した回答が得られない場合があります。 また、そのソースをコンパイルした、OS、コンパイラの名称も必ず補足してください。(例1windows-xp,visual studio2008,例2linux,gcc等)
お礼
いろいろと不足があったみたいですいません。 今度からコードはコピペします。 一応、OSはlinuxでコンパイラはそれについてたのだから gccだと思います。(少なくともborlandとwindowsのvisual...じゃないです) ソースコードの方が学校にあって今はないので 頑張って自分で探します。 ご回答ありがとうございました
お礼
いろいろと言葉足らずなところがありまして 質問の趣旨をあまり伝えることができなくてすいません。 ですが、驚くべきことに質問者さんは 私が知りたかった答え的な回答ドンピシャでしたww この回答を見て 私の使ってるlinuxではstdio.hの中にはほとんど宣言がないので いろいろ探してみたところ、 bits/stdio_lim.hにFOPEN_MAX 16があり libio.hにIO_FILE_ という構造体が宣言されているんで あまり自信ないですがたぶんこれがファイルのデータを格納する構造体だと思います。 ありがとうございました。