【C言語】ヘッダファイル / Header File
【C言語】
ヘッダファイル / Header File
「ヘッダファイル」とは
「ヘッダファイル」は、
インクルードされるためのファイルで、
「ヘッダファイル名.h」という名前で作成されたファイルに、
「構造体」「プロトタイプ宣言」を記述したものを、
「ヘッダファイル」という。
通常、ヘッダファイルには、
関数の中身は書かず、
中身はソースファイル (.c) の方に記述する。
ヘッダファイルには、
メモリを確保する内容を記述すると、
多重エラーなどが発生するため、
変数・関数の定義はできない。
実際のソースは、「同名.c」ファイルに記述し、
ソースファイルの「.c」 とヘッダファイルの「.h」 の
両者を対応させるように作り上げていくのが一般的。
ヘッダファイルと同名のソースファイル「.c」で、
「ヘッダファイルを呼び込み」「関数」「変数」などの
定義をすることで、
ヘッダファイルとしての機能が完成する。
Back
「ヘッダファイル」にできること
マクロの定義 | 例、#define MAX_COUNT (10) |
クラスの定義 | 例、class CManiac { int m_iValue; } |
変数の宣言(定義ではない) | 例、extern int g_iCounter; |
更に他のヘッダをインクルードすること | 例、#include <string> |
- staticな関数やグローバル変数の宣言はヘッダファイル内には書かない
- グローバル変数をextern宣言する
- ヘッダファイル内では他のヘッダファイルのインクルードを最低限に留める
- ヘッダの中に、メモリを確保するようなコードを書いてはいけない。
- メモリを確保するコードは *.cpp の中に書く。
- 変数を共通化するには、変数の extern 宣言をヘッダの中に書く。
Back
「ヘッダファイル」の保存ディレクトリ
- /usr/include
- /usr/ucbinclude
Back
「ヘッダファイル」の書式
「ヘッダファイル」は、
「関数」「定数」「構造体」などを
あらかじめ定義して、
機能するプログラム記述しておくことで、
「ヘッダファイル」を読み込み、
「関数名」などを呼び出すだけで、
「ヘッダファイル」内にある「関数」などを
利用することができるようにできます。
「ヘッダファイル」は、
「定数」「構造体」「関数」などを宣言することができます。
ですが、
「関数」の実行内容は、
「ヘッダファイル」の「ヘッダファイル名」と同じ
「ソースファイル(ヘッダファイル名.c)」を作成して、
関数の実行内容を記述します。
「ヘッダファイル」の書式で注意したいのが、
・グローバル変数の定義
・関数定義
を含めてはいけない点。
上記の内容は、「ヘッダファイル名」と
同じ名前の「ソースファイル(ヘッダファイル名.c)」を作成して、
その「ソースファイル」に記述する。
「ヘッダファイル」の構成部品一覧
・多重インクルード防止
・ヘッダファイルインクルード
・マクロ定義
・型定義
・プロトタイプ宣言
・グローバル変数の外部参照宣言
「ヘッダファイル」に記述しない部品
・グローバル変数定義
・関数定義
「ヘッダファイル」の構成部品リスト
部品 | 配置可否 | 役割 |
多重インクルード防止 | 〇 | ヘッダファイルを多重にインクルードされるのを防止 |
ヘッダファイルインクルード | 〇 | #includeによる外部ファイルのインクルード |
マクロ定義 | 〇 | #defineによる定数定義 |
型定義 | 〇 | 構造体、列挙型、共用体のデータ型定義 |
プロトタイプ宣言 | 〇 | 関数のプロトタイプ宣言 |
グローバル変数外部参照宣言 | 〇 | 外部ファイルへ公開するグローバル変数の参照宣言 |
グローバル変数定義 | × | グローバル変数の実体定義 |
関数定義 | × | 関数の実体定義 |
「ヘッダファイル」の「ソースファイル」に記述する構成部品リスト
部品 | 記入可否 | 役割 |
多重インクルード防止 | × | ヘッダファイルを多重にインクルードされるのを防止 |
ヘッダファイルインクルード | 〇 | #includeによる外部ファイルのインクルード |
マクロ定義 | △ | #defineによる定数定義 |
型定義 | △ | 構造体、列挙型、共用体のデータ型定義 |
プロトタイプ宣言 | △ | 関数のプロトタイプ宣言 |
グローバル変数外部参照宣言 | × | 外部ファイルへ公開するグローバル変数の参照宣言 |
グローバル変数定義 | 〇 | グローバル変数の実体定義 |
関数定義 | 〇 | 関数の実体定義 |
「ヘッダファイル」のサンプルコード
#ifndef 記号定数
// 「記号定数」で指定した名前が「定数」で定義されていない場合のみ「#endif」までが実行される。
#define 記号定数
// 「記号定数」で指定した名前を「定数」として定義する
//------------------------------------------------
#include <ヘッダファイル名.h>
//------------------------------------------------
// マクロ定義(Macro definition)
//------------------------------------------------
#define 定数名 値
//------------------------------------------------
// 型定義(Type definition)
//------------------------------------------------
typedef struct
{
型 変数名;
型 変数名;
型 変数名;
} 構造体名;
//------------------------------------------------
// プロトタイプ宣言(Prototype declaration)
//------------------------------------------------
型 関数名(引数の型 引数変数);
//------------------------------------------------
#endif
「#ifndef」と「#ifdef」の違い
「#ifdef」は、
「#ifdef 定数名」で指定した「定数」が定義されているときに、
「#endif」まで実行される。
「#ifndef」は、
「#ifndef 定数名」で指定した「定数」に定義されていない時に、
「#endif」まで実行される。
「ヘッダファイル」の「ソースファイル」基本フォーマット
#include <ヘッダファイル名.h>
#include <ヘッダファイル名.h>
#include "ヘッダファイル名.h"
//------------------------------------------------
// 関数の実装
//------------------------------------------------
型 関数名(引数の型 引数変数)
{
printf("%s %d", 変数名, 変数名);
return 0;
}
Back
「ヘッダファイル」を読み込む書式
「ヘッダファイル」を読み込む書式は、
#include <ヘッダファイル名.h>
#include "ヘッダファイル名.h"
の2種類。
読み込む「ヘッダファイル」によって、
2つの読み込む書式を使い分けます。
ヘッダファイル書式 | |
#include <ヘッダファイル名.h> |
stdio.h のような標準ヘッダをインクルードする。
ヘッダファイルの場所は環境変数INCLUDEで指定したディレクトリ。
コンパイラのデフォルトのインクルードパス及びコンパイルオプションで、
指定したインクルードパスを起点として挿入するファイルを検索。
|
#include "ヘッダファイル名.h" |
自分で用意したヘッダファイルをインクルードする。
普通ユーザが作ったヘッダファイルを指定するとき使う。
ヘッダファイルの場所は、 ソースファイル(拡張子.c)と同じ場所。
カレントディレクトリのパスを起点として挿入するファイルを検索、
ファイルが見つからなかった場合 「#include <挿入するファイルのパス>」 と同様の検索を行う。
|
Back
「C言語」のライブラリ関数 一覧
(参考)「void * 関数名()」 とは
「void * 関数名()」 は、
返り値のポインタに、
どのような型でも指定できる
「汎用ポインタ型」ということを表している。
関数を指定する場所によって、
ポインタの型が異なるため、
使用するたびにポインタの型を指定しなければならない。
この「void *」で、
「ポインタ型指定して、返り値のポインタを受け取る。」と宣言する。
使用するときの型指定は、
本来の目的の型でキャストしてやるべき。
ヘッダファイル名 | 機能 |
assert.h | 診断機能 |
complex.h | 複素数計算 (C99より追加) |
ctype.h | 文字操作 |
errno.h | エラー |
fenv.h | 浮動小数点環境(C99より追加) |
float.h | 浮動小数点型の特性 |
inttypes.h | 整数型の書式の変換 (C99より追加) |
iso646.h | 代替つづり(Alternate spellings)(C95より追加) |
limits.h | 整数型の大きさ |
locale.h | 文化圏固有操作 |
math.h | 数学 |
setjmp.h | 非局所分岐 |
signal.h | シグナル操作 |
stdarg.h | 可変個数の実引数 |
stdbool.h | 論理型および論理値 (C99より追加) |
stddef.h | 共通の定義 |
stdint.h | 整数型 (C99より追加) |
stdio.h | 入出力 |
stdlib.h | 一般ユーティリティ |
string.h | 文字列操作 |
tgmath.h | 型総称数学関数(Type-generic math) (C99より追加) |
time.h | 日付及び時間 |
wchar.h | 多バイトおよびワイド文字拡張ユーティリティ(C95より追加) |
wctype.h | ワイド文字種分類およびワイド文字大文字小文字変換ユーティリティ(C95より追加) |
winsock.h |
Winsockはウィンドウズでソケットを使ってプログラムを書くためのAPI(Application Program Interface)
Winsockを使うと、TCP/IPなどインターネットを使って通信を行うプログラムが書けます。
|
winsock2.h |
Winsockはウィンドウズでソケットを使ってプログラムを書くためのAPI(Application Program Interface)
Winsockを使うと、TCP/IPなどインターネットを使って通信を行うプログラムが書けます。
|
Back