LoginSignup
126
99

More than 5 years have passed since last update.

C言語におけるinclude文とgcc -Iオプションの関係

Last updated at Posted at 2014-11-09

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最優先探索先として追加される。

126
99
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
126
99