#includeプリプロセッサ命令 - ファイルのインクルード
#includeプリプロセッサ命令は、他のソースコードをインクルードするためのプリプロセッサ命令です。
#include <ファイル名> #include "ファイル名"
ファイル名で指定されたファイルの内容を、現在のソースコードに、埋め込みます。
「<ファイル名>」と「"ファイル名"」の違いはどうやらプリプロセッサの実装に依存するようです。
gccで試してみた結果です。
「<ファイル名>」の場合は「-I オプションで指定されたディレクトリ」「システムのヘッダファイルのインクルードパス」の順にファイルを検索します。
「"ファイル名"」の場合は「カレントディレクトリ」「-I オプションで指定されたディレクトリ」「システムのヘッダファイルのインクルードパス」でファイルを検索します。
複数の「-I」オプションが指定された場合は、先に指定したIオプションから検索されます。
使い分けとしては、標準ライブラリを使う場合や、システムのヘッダファイルのインクルードパスにインストールされているライブラリを使う場合は「<ファイル名>」、自作のアプリケーション用のヘッダファイルはは「"ファイル名"」くらいの感じでよいのではないでしょうか。
#includeプリプロセッサ命令のサンプル
#includeプリプロセッサ命令のサンプルです。
標準ライブラリのヘッダを読み込む
標準ライブラリのヘッダを読み込みます。
#include <stdio.h> int main(void) { printf("%s\n", "Hello World!"); }
自作のアプリケーションのヘッダファイルを読み込む
自作のアプリケーションのヘッダファイルを読み込みます。
#include "myapp_lib.h" int main(void) { // myapp_lib.hで宣言されている関数を使うなど }
読み込むファイルの拡張子は「.h」でなくてもよいのですか?
はい、拡張子名は関係ありません。たとえば「.c」でも読み込めます。読み込めますが、本当に特別な理由がない限りは、ヘッダファイル以外は読み込まない方がよいでしょう。
ファイル名は、絶対パスでも良いのですか?
はい、ファイル名は絶対パスでもかまいません。ただし、本当に特別な理由がない限りは、相対パスで読み込むのがよいでしょう。
システムのヘッダファイルのインクルードパスを調べるにはどうすればよいですか?
「いったいどうやってしらべりゃーいいのよ!」
これは、コンパイラのプリプロセッサに静的に書き込まれた情報ですので、プリプロセッサの情報を調べる必要があります。
Ubuntuの場合に、調べ方を記述した記事があるので、参考にしてください。
なぜヘッダファイルをインクルードするだけで、標準ライブラリが使えるのですか?
「なぜヘッダファイルをインクルードするだけで、標準ライブラリが使えるのですか? libstdio.oのようなオブジェクトファイルをリンクしないで使えるのはなぜですか?」
gccの場合で説明しますが、「printf関数」など標準ライブラリが実装された「libglibc.o(あるいはlibglibc.so)」というオブジェクトファイルが、暗黙的にリンクされるからです。