プロが教える店舗&オフィスのセキュリティ対策術

上記のタイトルの参考書で今、C言語の勉強をしています。

第8章のfopenを低水準入出力関数で実装する
という項目に取り組んでいるのですが
参考書通りにコーディングしても
_iod

OPEN_MAX
が見つからないみたいなコメントが出てきて
コンパイルができません。
どのヘッダファイルをインクルードすれば良いのでしょうか?

A 回答 (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#XAzRy …

これ見る限り、「似たような」コードではありますが……。ザーっと読む限り、K&Rで記述されているOPEN_MAXはFOPEN_MAXになっているようですし、また、_iobは__sFILEになってるんじゃないかな?多分。
つまり、使用している環境/コンパイラによって「変数の名称が違う」んですね。また、僕の使ってるLinuxでのgccのstdio.hも一応見てみたんですが、FreeBSD版と違って若干ゴチャゴチャしてましたが(笑)、やっぱり「違う」わけです。
つまり、「低水準入出力関数で実装する」以上、お使いのコンパイラでのヘッダーファイルの記述がどうなってんのか、熟知する必要があるのではないでしょうか?
ないしは、UNIX使ってないんでしたら、この章は飛ばしても大丈夫なのかな、とかちょっと思いました(笑)。
    • good
    • 0
この回答へのお礼

いろいろと言葉足らずなところがありまして
質問の趣旨をあまり伝えることができなくてすいません。

ですが、驚くべきことに質問者さんは
私が知りたかった答え的な回答ドンピシャでしたww

この回答を見て

私の使ってるlinuxではstdio.hの中にはほとんど宣言がないので
いろいろ探してみたところ、
bits/stdio_lim.hにFOPEN_MAX 16があり
libio.hにIO_FILE_
という構造体が宣言されているんで
あまり自信ないですがたぶんこれがファイルのデータを格納する構造体だと思います。

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

お礼日時:2009/03/29 19:52

 _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ウィザードになってもここはいつでも役に立つので何度でも読み返されると良いでしょう。
    • good
    • 0
この回答へのお礼

すみません_iodは誤記です。
え??
…これって/include/stdio.hの抜粋じゃないんですか?

まぁ、確かに打ち込めば話は早いですね
ですが、私としては、ライブラリの勉強がしたいのでstdio.hを見て探しました。

gccのstdio.hだと、変数名とか、宣言の場所がこの本と違うんで分からないんです。
たぶん、この本が出版されてからかなり経ってるので標準ライブラリの形が変わってしまってるんでしょうね。
その上で、現在ではどこにファイルのデータを扱ってる構造体宣言があるのかを聞きたかったのですが
言葉足らずだったみたいです
また出直します

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

お礼日時:2009/03/29 19:41

エラーになったソースを補足してください。


補足する際は、手で打ち込むのではなく、元のソースをコピーして貼り付けてください。手で打ち込むときに、打ち込み間違いがあり、そのため、期待した回答が得られない場合があります。
また、そのソースをコンパイルした、OS、コンパイラの名称も必ず補足してください。(例1windows-xp,visual studio2008,例2linux,gcc等)
    • good
    • 0
この回答へのお礼

いろいろと不足があったみたいですいません。
今度からコードはコピペします。
一応、OSはlinuxでコンパイラはそれについてたのだから
gccだと思います。(少なくともborlandとwindowsのvisual...じゃないです)

ソースコードの方が学校にあって今はないので
頑張って自分で探します。

ご回答ありがとうございました

お礼日時:2009/03/29 19:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!