ヘッダファイルの読み込み

includeマクロを使ってヘッダファイルを読み込む方法を解説します。

#include ヘッダファイル名

ヘッダファイル名は、システムのヘッダ読み込みパスである場合は「<ヘッダファイル名>」と書きます。

#include <stdio.h>

自作のライブラリで、システムのヘッダファイルの読み込みパスではない場所から、ライブラリのヘッダを読み込む場合は、「"ヘッダファイル名"」と書きます。

#include "mylib.h"

ヘッダファイル以外を読み込むことはできますか?

はい。ヘッダファイル以外を読み込むことはできます。でもおそらく、基本的には、それは望ましいことではないはずです。C言語を始めた段階で、もしヘッダファイル以外を読み込む必要があると考えたときは、少し立ち止まって考えてください。

ひとつの用途としては、大量の静的にデータを定義(Unicodeの文字の定義など)する場合に、ファイルを分けておきたいという理由で、利用されている例を見たことがあります。

システムのヘッダファイルの読み込みパスはどこで定義されていますか?

システムのヘッダの読み込みパスの一つはたとえばUbuntuでは「/usr/include」です。他のUNIX/Linuxディストリビューションの場合は、異なったりします。

システムのヘッダファイルの読み込みパスを調べるにはどうすればよいのでしょうか?

実は、ヘッダーファイルの読み込みパスは、C言語のプリプロセッサに書き込まれています。

まず、gccが使っているプリプロセッサのパスを調べます。

gcc -print-prog-name=cc1

以下のように出力されます。

/usr/lib/gcc/x86_64-linux-gnu/7/cc1

プリプロセッサのバージョンを表示すると、インクルードパスをが表示されます。

/usr/lib/gcc/x86_64-linux-gnu/7/cc1 -v

デフォルトのヘッダーファイルの読み込みパスが表示されます。

ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/7/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/7/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/7/include-fixed
 /usr/include

なぜ標準ライブラリはヘッダファイルの読み込みだけで関数が利用できるのですか?

通常は、ヘッダファイルを読み込み、ライブラリあるいはオブジェクトファイルをリンクしないと、関数は利用できませんね。

「stdio.h」など、C言語標準のライブラリの場合は、この作業が必要ないですね。

実は、gccのリンクで実行ファイルが生成されるときに、C言語の関数が実装されたglibc(libc)と呼ばれるライブラリがリンクされます。

マクロとは何ですか?

C言語のマクロとは、#ではじまる一つの構文です。マクロの記述は、ソースコードのコンパイルが始まる前に、C言語プロプロセッサによってソースコードに展開されます。

関連情報