Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away