• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語について。)

C言語の定義・宣言についての疑問

このQ&Aのポイント
  • C言語には、色んな物が定義・宣言されている。バッファだけが定義されているなら「など」とは書きません。
  • stdio.hには、外部のライブラリの中にバッファや関数などがあり、必要な定数も定義されています。入出力バッファやFILE構造体など、色んな物が定義されています。
  • stdio.hの外部とは、stdio.hのライブラリの中に別のライブラリがあることを指しています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.8

「stdio.hは、標準的な入出力を行う場合に必要なバッファなどが定義されているファイルです。」 この説明文の 意図が私にはちょっとわかりません。 バッファを用意しているのは、stdio.hというヘッダファイルではなくて、 標準I/Oライブラリの関数を呼び出す側(main()等)で行うので。 標準I/Oライブラリ内にある関数を、 自分の作ろうとしているソースコードから使うためには 各関数の戻り値や引数の型宣言、構造体定義、マクロ定義が必要なので そのために ヘッダファイル(stdio.h)を #include しておく必要がある (おまじない)という理解でよいと思いますよ。

その他の回答 (7)

回答No.7

コンパイラが用意してくれている外部ライブリを使うのであれば、 そのライブラリ用のヘッダファイルをソース上に#incudeで取り込んでおいて、 関数の型宣言や 構造体定義や 定数の宣言や マクロの定義をさせておく必要がある といのはC言語の1つの特徴ですね。 つまり、 ファイルやコンソールに対して読み書きをするときに コンパイラが用意してくれているprintf( )とかfgets( )といった 標準I/Oライブラリ(Standard I/O library )にある関数を使うのであれば、 ソースの先頭で #include <stdio.h>  を記載しておきましょう。 ということになります。

zasx1097
質問者

補足

stdio.hは、標準的な入出力を行う場合に必要なバッファなどが定義されているファイルです。という文章で、などがついていますが、バッファ以外に何かするのでしょうか?stdio.h以外のファイルがある事でしょうか?教えていただけると嬉しいです。なるべくわかりやすく教えていただけると嬉しいです。

回答No.6

>アセンブラをバイナリ化すると、どうやって呼んでいいのかわからないとはどういう事でしょうか? これは、アセンブラを理解しないと説明は難しいので、 C言語同士で、勉強した方がいいでしょう。 a.cとb.cというファイルがあったとします。 b.c に例えば int waa(int a,char b,long c) { // 何らかの処理 } を入れたとしますが、 a.cはb.cにそれがいることを知らないでしょ? waaってのは、どんなパラメーターで何を渡せばいいのか? そして返り値は何なのか? これを知る方法がないのですよ。 だから、「ヘッダーファイル」が登場し そこに「プロトタイプ」がおかれます。 今回のサンプルは、パラメタは、 fastcallのimmediateですが、 もしかしたら、ポインタだったり構造体だったりするかも (どっちにしても、結果としてはポインタ渡しになるが) これらを教えるためのヘッダーです。 ってのを、勉強してみればOK そうすれば、stdioなりstdlibが なぜその名前で、なぜプロトタイプが入っているかわかります。 今の目線じゃなくて、別角度でみてください。 「どんなことが書いてるか?」以上が気になったら 「なぜ必要だったのか?」って観点で見れば 答えは出てくるかと。

回答No.5

>それらを呼び出すプログラムが、stdio.hに書かれているということでしょうか? 違う! .hは、ヘッダーです! アセンブラをやった時 _abc: add ax,bx ret みたいな、命令を見たと思います。 で、このアセンブリコード 何をセットすれば何が返るか?わかります。 上の例では、 int abc(int s,int t) { return (s+t); } とCでは、書いてます。 つまり、アセンブラをバイナリ化すると、 どうやって呼んでいいのか、わからないのですよ! だから、.h=ヘッダーが登場するってわけ! なお、例えばですが、 putsは、putcを繰り返すだけのソースなのは、わかります? たとえば、 puts(*s) { char c; while(c=*s++) { putc(c); } putc('\n');  ここは機種依存です、Windows系はCRLF、LinuxはLF  古いMACは、CRです。 } ってな、依存部を.hで吸収しつつ、 実際には、putcにつながる「ライブラリ」なんです。 で、putcは、C言語では不可能です。 実行しているOSのシステムファンクションを呼ぶ必要があり ここが本当の、IOドライバになりますね。 しかし、どちらも、ライブラリでまとまり、 呼び出し方をstdioで宣言しているという具合。 なお、FILEですが、ファイルディスクプリタには、 キーボード系のインターフェースも結合されているので、 FILE *fp=stdin; だったり、stdoutを接続できますよ。 つまり、入力も「ファイル」なんです。 PHPでPOSTやった時に、STDINに HTMLでFORMを送った値が入っていて、 それ自体が「ファイルIO」だったのを覚えていれば もっといいのですがね!。 同じように、PHPが送り返す出力もSTDOUTなんです。 って感じで、基礎を覚えれば、全部の話が繋がるんですが、 ある一点を見てると、理解が遅くなるだけなので、 視点を変えてみてはいかがですか?

zasx1097
質問者

補足

迅速な返信大変恐縮です。 アセンブラをバイナリ化すると、どうやって呼んでいいのかわからないとはどういう事でしょうか?教えていただけると嬉しいです。

回答No.4

>FILE構造体がファイルシステムがそのシステムにあるとは限らないとはどういうことでしょうか?教えて頂けると嬉しいです。 例えば、ファミコンカセットがあったとします!。 当然、フロッピーも、HDDも何もありませんね? FILE構造体は、どう使いますか? って事です、スタンダードな機器として不要なら、 そのシステムでは、stdioには、FILE構造体はないのですよ。 あっても無意味だから! 同じように、画面がない組み込み機器。。 例えば、「リモコン」の中身をC言語で作ったとします。 液晶も何もないとしたら、putsだのprintfは、全く意味を持ちませんよね? という感じで、その機種の標準にあわせられてることが多いです。 ただし! 全く存在しないケースと、 #define puts(_x_) 見たいに書くと「空っぽ」に展開する=つまりなかったことにすることで コンパイルを通すになっているケースもあり、 機種に依存する部分は、さまざまものですよ。 C言語=パソコンとは限らないのでね!。 今「言語」を見てたわけですが、「それを動かす機器」を 想像して、それにどんな標準入出力が必要かな~って 考えると「あ~」ってなインスピレーションにつながるかと。 なお、通常組み込み向けの場合、 ハードウエアのIOライブラリが使われ、 画面がついていても、printfは使いませんがね。 (なお、これ、金になりますよ。。  組み込み向けROM化用のコンパイラでの開発。  又は、クロス環境での開発)

zasx1097
質問者

補足

迅速な返信大変恐縮です。 FILE構造体がある場合は、どんな場合でしょうか? それとつまり、printfなどの関数は、ライブラリやシェアードオブジェクトなどにあり、それらを呼び出すプログラムが、stdio.hに書かれているということでしょうか? 教えていただけると嬉しいです。

回答No.3

stdio = Standard Input/Output でしょ? 標準入出力なんだから、 バッファだけで「入出力」できるわけないですね? 例えば、WindowsとMACで、全く同じ実行ファイルは 動くか?って動くわけがありませんね? 逆に考えてみてください。 一切どこにも表示することができない環境で、 printfを作るとしたら、どうしますか? (組み込み向けCコンパイラーなどは例外があります) printf って書いたら、コンパイラのstdioが その機種の標準入出力に接続して表示を行うわけで。 それらが、ライブラリ=LIBや、シェアードオブジェクト=SO などにまとめられている外部プログラムを呼び出すわけです。 それらをどう呼び出せばいいのかな~?ってのが、 stdio.hに入っていると思えばよいかと。 同じようにFILE構造体と書いてますが、 ファイルシステムがそのシステムにあるとは限らないわけです。 だからこそ「など」です。 あるかもしれないし、ないかもしれない。

zasx1097
質問者

補足

つまり、printfなどの関数は、ライブラリやシェアードオブジェクトなどにあり、それらを呼び出すプログラムが、stdio.hに書かれているということでしょうか? FILE構造体がファイルシステムがそのシステムにあるとは限らないとはどういうことでしょうか?教えて頂けると嬉しいです。

  • bardfish
  • ベストアンサー率28% (5029/17766)
回答No.2

.hは私はヘッダーファイルとワンでいます。 今はわかりませんが、昔はヘッダーファイルをエディタで開くと色々とコメントが書いてあるんですよね。それを読むだけでも勉強になりました。ただし全部英語・・・ そして、ヘッダーファイルの中には他のヘッダーファイルが必要なモノも存在ししていました。 だから自分で記述するソースにはヘッダーファイルが必要とする別のヘッダーファイルもIncludeで記述した記憶があります。 コンパイラーにもよりますが、インラインアセンブラも記述されていてたりします。わかりやすいところで言うとCPUに合わせて寄り高度な最適化を行う場合ですね。CコンパイラのオプションでCPUの種類を指定できたりしますが、その設定が生きてくる箇所がヘッダーに記述されている事もあります。 詳しく知りたければヘッダーファイル内のソースを自力で理解してください。 SDTIO.Hの場合はLinkerで指定されている.libファイルを使用する為の定義も含まれていますからね。 今の統合環境前提のコンパイラーだとなかなか目にする機会が少ないところでもありますから疑問に思う事すらしない職業プログラマーも多いんでしょうね。もっとも仕事としてプログラマーをしているとそんな調べ物の優先度はないに等しいでしょうから気になっても調べる時間がとれなかったりしてね。

  • asciiz
  • ベストアンサー率70% (6803/9674)
回答No.1

stdio.h はテキストファイルですから、それを開いて見て、内容を読んでください。 そこに記述されていることがすべてです。

関連するQ&A