【愚問】C言語のヘッダファイルについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
helloworld
記事: 6
登録日時: 8年前

【愚問】C言語のヘッダファイルについて

#1

投稿記事 by helloworld » 7年前

初歩的な質問ですみません。愚問です。
教えていただけたら幸いです。

C言語のプログラムに
[#include <stdio.h>]
という行があります。
[stdio.h]
標準入出力ヘッダファイルを読み込むということは分かりました。
そこで疑問に思ったことが3点あります。

1.それってつまり、
ヘッダファイルという、プログラムのコードが書いてあるプログラムの内容を
[#include <stdio.h>]
と書いてある部分に書いたのと同じということでしょうか?

2.もし1.の疑問が正しければ、
[#include <stdio.h>]
と書かなくても、
[stdio.h]
の内容を
[stdio.h]
に書けば良いということでしょうか?

3.愚問ですが、
自家製じゃないと料理はしないぜ‼野菜も油もフライパンも全部自家製だぜ‼みたいなノリで、
[#include]
なんて誰が使ってやるもんか‼
[stdio.h]の内容を
自作するプログラムの中に全部書き込んで、
[#include]なんて使わずに動かしてやるぜ‼
ということも可能でしょうか?(プログラムの行数が馬鹿みたいに長くなりそうですが…。)

また、気になったので、
[stdio.h]
の中身のプログラムを見たのですが、
[stdio.h]
の中で
別のヘッダファイルを読みだしています。
そういった場合も全部移さないとだめですよね…?

長文失礼しました。読んでいただいてありがとうございます。
ご回答いただけましたら幸いです。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: 【愚問】C言語のヘッダファイルについて

#2

投稿記事 by YuO » 7年前

helloworld さんが書きました:初歩的な質問ですみません。愚問です。
初歩的とか愚問とかは書く必要はありません。
回答者に対して印象を悪くするだけです。
helloworld さんが書きました:1.それってつまり、
ヘッダファイルという、プログラムのコードが書いてあるプログラムの内容を
[#include <stdio.h>]
と書いてある部分に書いたのと同じということでしょうか?
おおむねその通りになります。
__FILE__と__LINE__に限って,インクルードしているファイル名やファイルの行番号になるため,動作が異なります。
また,非標準のプラグマであるonceのように,一つの翻訳単位中で2度目以降に読み込まれた場合に動作が変わるものがありますが,
それらに関しても異なる動きをします。
helloworld さんが書きました:2.もし1.の疑問が正しければ、
[#include <stdio.h>]
と書かなくても、
[stdio.h]
の内容を
[stdio.h]
に書けば良いということでしょうか?
一応はその通りになります。
全部書かないまでも,標準規格上,

コード:

int printf(const char *, ...);
という宣言をしておくことで,<stdio.h>がなくてもprintf関数を使えるようになります。
規格書中で該当する箇所は次になります。
ISO/IEC 9899:2011 さんが書きました:7.1.4 Use of library functions
2 Provided that a library function can be declared without reference to any type defined in a header, it is also permissible to declare the function and use it without including its associated header.
ただし,ソースコード中に展開する場合は規格書7.1.3 Reserved identifiersの縛りを受けます。
__から始まる識別子や_と大文字の識別子など,実装用が使うことが想定されている識別子が<stdio.h>等には使われているでしょうから,そのまま展開すると未定義の振る舞いとなります。
# 実際には<stdio.h>をインクルードした場合と同じくコンパイル可能でしょうけれど。
helloworld さんが書きました:[stdio.h]
の中身のプログラムを見たのですが、
[stdio.h]
の中で
別のヘッダファイルを読みだしています。
そういった場合も全部移さないとだめですよね…?
なぜでしょうか。

box
記事: 2002
登録日時: 13年前

Re: 【愚問】C言語のヘッダファイルについて

#3

投稿記事 by box » 7年前

helloworld さんが書きました: [stdio.h]
の内容を
[stdio.h]
に書けば良いということでしょうか?
ちょっと意味がわかりません。後の方のstdio.hというのはどこに置くことを想定されていますか?
helloworld さんが書きました: [stdio.h]の内容を
自作するプログラムの中に全部書き込んで、
[#include]なんて使わずに動かしてやるぜ‼
ということも可能でしょうか?(プログラムの行数が馬鹿みたいに長くなりそうですが…。)
原理的には可能かもしれません。が、
悪いことはいいませんから絶対にやめましょう。
先人の知恵はそのまま拝借する方がよいです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 【愚問】C言語のヘッダファイルについて

#4

投稿記事 by Dixq (管理人) » 7年前

愚問ではありませんよ、学び始めた人が誰も疑問に思う普通のことだと思います。
おそらくincludeしている対象のファイルの中身をコーディングしているファイルにそのままコピペすればinclude文が無くても動くのかということですよね?
それであればYuOさんの書いていらっしゃる通りです。

C言語というものはそれだけ(何もincludeしない状態)では非常に少ない機能しか持ちません。
逆に言えば何もincludeしなくてもコンパイルは通りますし実行も出来ますよ。
それを視覚化できず見えないので大抵視覚化できるライブラリであるstdio.hがincludeしてあるのです。

例えば以下のコードは何もinclude文がありませんが、コンパイル、実行できます。

コード:

int main(void)
{
	int a;
	a = 1;
	return 0;
}
しかしprintf等目に見える状態に出力する処理が何もできないので実行結果は目に見えません。

〇〇.hをincludeするごとにC言語の能力がパワーアップすると覚えておけば良いと思います。
文字列処理をしたいのであれば#include <string.h>することでstring.hに書いてある関数が使えるようになりますし
http://www.c-tipsref.com/reference/string.html
時間に関する処理をしたいのであれば#include <time.h>することでtime.hに書いてある関数が使えるようになりますし
http://www.c-tipsref.com/reference/time.html
includeしたらその分だけ出来ることが増えるのです。

標準でどんなヘッダファイルがあるのか、どんなパワーアップが出来るのかはこの辺のサイトを参考にしてください。
http://homepage3.nifty.com/mmgames/c_guide/r_lib.html

当サイトでも紹介していますが、プレステのようなゲームが作れるようにC言語をパワーアップする方法についてはこちらをご覧ください
http://dixq.net/g/m_02.html

アバター
usao
記事: 1889
登録日時: 11年前

Re: 【愚問】C言語のヘッダファイルについて

#5

投稿記事 by usao » 7年前

>自作するプログラムの中に全部書き込んで、

この労力を削減するのがincludeの目的だと思うので,
労力を割くことを厭わないならば全部書いて良いです.
オフトピック
誰もが一度は

コード:

//test.h
int main()
{

コード:

#include <stdio.h>
#include "test.h"
  printf( "hello test" );
  return 0;
}
とかなんとか書いて遊びますよね.
オフトピック
以下,正確な物言いではありませんが…
大抵の場合,

・必要としている物は2種類(宣言と実装)
・ヘッダファイルというのは大抵はそのうちの一方(宣言)が記載されているもの

という感じなので,ヘッダファイルの内容を全部コピペしてきただけでは,

>全部自家製

と名乗るには不足でしょう.

閉鎖

“C言語何でも質問掲示板” へ戻る