#include につきまして<C言語

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ムンバ

#include につきまして<C言語

#1

投稿記事 by ムンバ » 15年前

こんばんは。

#include について、ご意見をお伺いしたいので宜しくお願いします!

1.種類(種別名?)
 ・プロトタイプ宣言

2.役割
 ・ヘッダファイルを呼び出す。
 ・ファイルをインクルードする。
 ・呼び出したいサブルーチンに関する情報があるファイルを呼び出す。
 

3.呼び出し(インクルード)
 ・ヘッダファイルのインクルード(呼び出し)は、ソースファイルの先頭に記述する。
 ・システムに用意されているヘッダファイルは < > で囲む。
 ・自作のヘッダファイルは " " で囲む。

中途半端で重複する文章・単語等あると思うのですが
ネット検索や教本などを参照に、自分なりにまとめてみました。
賛否両論あると思うのですが、初心者の理解度としては
こんな感じで良いのでしょうか?

お時間ある方、ご指導の程、宜しくお願い致します。
(有用とか商用とかの予定は、一切ありません。)


---↓追加・言い訳---

文中の

<<初心者の理解度としては
  ↑私の事です。

---↑追加・言い訳--- 画像

Poco

Re:#include につきまして<C言語

#2

投稿記事 by Poco » 15年前

> 1.種類(種別名?)
>  ・プロトタイプ宣言

違います。
正式名称は知りませんが、前処理指令と呼ばれるシロモノの中の一つです。
#詳しい人はフォロー願います。

> 2.役割
>  ・ヘッダファイルを呼び出す。
微妙に違います。#inlcudeはファイルを取り込むだけです。
それがヘッダファイルかどうかは関係ありません。

>  ・ファイルをインクルードする。
これが一番正確な表現です。別にヘッダファイルじゃなくても取り込めます。
↓のように書いても問題ありません(仕事でこういうコード書いていたら殴りますが。。)。
----
#include "hoge.c"
----

>  ・呼び出したいサブルーチンに関する情報があるファイルを呼び出す。

これも微妙に違います。
取り込んだファイルに「たまたま」サブルーチンに関する情報(プロトタイプ宣言)があるだけです。

> 3.呼び出し(インクルード)
>  ・ヘッダファイルのインクルード(呼び出し)は、ソースファイルの先頭に記述する。

慣例というか常識的にはソースの先頭に記述するものですが、
↓のようなコードでもエラーとはなりません。(意味は無いですが。)
---
int main() {
return 0;
}

#include <stdio.h>
----

>  ・システムに用意されているヘッダファイルは < > で囲む。
>  ・自作のヘッダファイルは " " で囲む。

個人的には、このようにしていますが、そうしなければならないルールはありません。
""で囲まれた場合は、処理系の検索順序に従ってファイルを探し、見つからない場合は、
<>で囲んだ場合の検索順序で探す、というようになっています。

---追記
ここまで書いていてなんですが、初心者の理解としては1以外は
そういう理解で構わないと思います。

#プロトタイプ宣言や、変数の宣言がひとまとまりになったものをヘッダファイルと言います。 画像

たかぎ

Re:#include につきまして<C言語

#3

投稿記事 by たかぎ » 15年前

#include指令の仕様に関する理解と、用法に関する理解をわけて考えるべきかと思います。

はじめに仕様に関してですが、#includeは別のところにあるソースを取り込むための前処理指令です。
ヘッダ名を<>で囲んだ場合は「ヘッダ」を取り込みます。「ヘッダ」はファイルとは限りません。また、「ヘッダ」の検索方法は処理系定義です。
""で囲んだ場合は、ソースファイルを取り込みます。検索方法はやはり処理系定義です。""で囲むやり方がサポートされていない場合、または指定したソースファイルが見つからない場合は、<>で囲んだものとして検索を行います。

次に用法ですが、原則論は誰か他の方が回答してくれると思いますので、変則的な使い方を説明します。
#include指令を記述した場所にソースが取り込まれるわけですから、これを利用して、そのときどきの状態を変化させることができます。具体的には<assert.h>を調べてみてください。
また、実装の一部を別のソースファイルに分離することもできます。
例えばこんなふうにです。

/* tcscpy.c */
tchar_t *tcscpy(tchar_t *s1, const tchar_t *s2)
{
tchar_t *result = s1;
while ((*s1 = *s2) != 0)
{
++s1;
++s2;
}
return result;
}

/* strcpy.c */
#define tcscpy strcpy
#define tchar_t char
#include "tcscpy.c"

/* wcscpy.c */
#include <stddef.h>
#define tcscpy wcscpy
#define tchar_t wchar_t
#include "tcscpy.c"

ムンバ

Re:#include につきまして<C言語

#4

投稿記事 by ムンバ » 15年前

自分の頭の、CPUとメモリ?の整理ができてませんです~っ!
あるいは自分のマザーボードが、イカレテルのかもしれません。ガ━━(= ̄□ ̄=)━━ン!!

>ぽこさん、たかぎさん
 ご意見・ご指導また具体的な例文等、ありがとうございます。

少し考える時間(数週間かかるかもしれませんが)を下さい。
宣言とか定義とかの意味が、自分の頭の中でごちゃごちゃになってまして。<自爆

ん~?揚げ足を取ってるとか、変な意味とか、悪意とかは本当に無いんです。
慣例とか習慣とか表現などの仕方、それぞれの方々がお持ちだと思いますので
今後も参考にさせて頂きたいと思います。

整理できたら、再度レスさせて頂きます。
その時は、また宜しければ、ご意見お願い致します。
またまた勝手ながら、おやすみなさい。<(_ _)>

ムンバ

Re:#include につきまして<C言語

#5

投稿記事 by ムンバ » 15年前

こんばんは!

昨日は(↑のレス)、すみませんでした。
寝ぼけてまして、ごめんなさい。(謝
数週間も悩む事じゃないですよね。^^;

>>ぽこさん
 ご丁重なご解説ありがとうございました。理解できました。
 前処理指令、了解致しました!

>ここまで書いていてなんですが、初心者の理解としては1以外は
>そういう理解で構わないと思います。

 まだ、ネットでも教本でも初級の勉強しかしていないので
 上述したような理解度になってしまっていました。
 ご解説、メモさせて頂きました。
 ありがとうございます!


>>たかぎさん
 例文まで入れて頂いてのご解説、どうもありがとうございました。
 仕様と用法とに分けて理解すれば良いのですね。

>「ヘッダ」はファイルとは限りません。

 1年位前にも、こちらの掲示板で、たかぎさんにご指摘頂きました。
 あの頃は超初心者だったので「何を言ってるんだろ~?」
 くらいにしか思えてなかったと思います。すみません。
 あの頃でしたら、このソースも読めなかったと思いますが
 今は、ばっちり読めます。^^
 <assert.h>、調べてみます!
 こちらもメモさせて頂きました。
 ありがとうございます!

まだまだ聞くだけのプログラマーですが
また何か御座いましたら、ご指摘ご指導の程宜しくお願い致します。
どうもありがとうございました。

閉鎖

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