C言語のincludeまわりがよくわかっていなかったので調査してまとめました。
間違いなどありましたら指摘いただけると幸いです。
#include <stdio.h>
のstdio.hファイルはどこにあるのか?
答え:/usr/include/stdio.h
解説:
#include <hoge.h>
と書くと、/usr/include/
内からヘッダーファイルhoge.h
が探索されて、存在すればそのヘッダーファイルの中身がinclude文のところに置き換えられる。
存在しなければコンパイルエラーになる。
任意の場所にあるヘッダーファイルを読み込みたいときはどうすればよいか?
方法その1:絶対パスで書けばよい。
例えば、/opt/json-c/include/json-c/json.h
というヘッダーファイルを読み込みたいときは、
#include /opt/json-c/include/json-c/json.h
と書けばよい。
ただ、Cのソースコード中にこのような絶対パスをハードコーディングしてしまうのは、環境依存の観点から好ましくないのは明らかである。(人や環境によってライブラリの所在場所は異なるので)
方法その2: コンパイラの-Iオプションを使う
cc(gcc)の-Iオプションで、ヘッダーファイルのあるディレクトリを指定することができる。
gcc -I /opt/json-c/include/json-c hello.c
こうすると、hello.cの中では
#include <json.h>
と書くことができる。
-Iオプションとinclude文は連結されて1つのパスを構成するので、下記のようにもできる。
gcc -I /opt/json-c/include hello.c
#include <json-c/json.h>
とか
gcc -I /opt/json-c hello.c
#include <include/json-c/json.h>
とか。
includeの探索の優先度は、
- -I オプションで命名されたディレクトリ
- /usr/include ディレクトリ
となっている。
なお、gccの場合は環境変数で探索ディレクトリを追加することもできる。
https://gcc.gnu.org/onlinedocs/gcc/Environment-Variables.html#Environment-Variables
#include "hoge.h"との違いは?
"hoge.h"のようにダブルクオーテーションでくくった場合は、そのソースファイルと同じディレクトリが、inclue最優先探索先として追加される。