C言語のヘッダ読み込み順について | (できれば)毎日書く日記

(できれば)毎日書く日記

うっぷんを晴らすためだけの日記です。

調べた内容のメモです。

gccでinclude文を書く際に、以下の2つの書き方があります。

1. #include <stdio.h> /* 標準(OSがもってる)ヘッダ */
2. #include "stdio.h" /* ユーザーが作ったヘッダ */

上記2のように、ユーザーが作ったヘッダをincludeするには
コンパイル時に
「includeファイル探す時はここを探してね」
とパスを指定しないといけません。

例えば、自分が作ったヘッダを
カレントディレクトリのひとつ上の"usr_header"に置いている場合は
このようにincludeするディレクトリを指定してコンパイルします。

gcc -I../usr_header -o test test.c

この例の場合、#includeでかかれたファイル名を探す順番は
include文の書き方に関わらず(< > でも""でも同じ)

1./usr_header を探す
2.gccで決められた場所 を探す

となります。

ここから本題。

では、user_header内にも stdio.h を作ってしまったけど
プログラムには 標準ヘッダのstdio.h を参照してほしい
という時はどうしたら良いか。

--sample.c--
#include <stdio.h>

int main(){

printf("test\n");

return 0;
}
-------------

#gcc -I../usr_header -o sumple sumple.c

↑さっきの例のこれだと
先に../usr_header/stdio.hを参照してしまうので
標準ヘッダのファイルを参照できない。

こういうときは

#gcc -iquote../usr_header -o test test.c

と実行すれば良いようです。

" -iquote "とは・・・-----

#include文が" "で定義されている時だけ
指定したディレクトリを探しに行く

-----------------------

上記のコンパイルコマンドの例だと、
コード中に#include "stdio.h"と書かれいるときだけ
../usr_headerを探しにいきます。

★補足★
コンパイル時に、どこのディレクトリを参照しにいってるか
調べるのは、以下のコマンドでできます。

# gcc -v -iquote./inc -iquote./test include.c

<実行結果>
Using built-in specs.
Target: i386-redhat-linux
コンフィグオプション: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=i386-redhat-linux
スレッドモデル: posix
gcc バージョン 4.1.2 20080704 (Red Hat 4.1.2-46)
/usr/libexec/gcc/i386-redhat-linux/4.1.2/cc1 -quiet -v -iquote./inc -iquote./test include.c -quiet -dumpbase include.c -mtune=generic -auxbase include -version -o /tmp/ccvBNb7w.s
存在しないディレクトリ "/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/include" を無視します
#include "..." の探索はここから始まります:
./inc
./test
#include <...> の探索はここから始まります:
/usr/local/include
/usr/lib/gcc/i386-redhat-linux/4.1.2/include
/usr/include
探索リストの終わり
GNU C version 4.1.2 20080704 (Red Hat 4.1.2-46) (i386-redhat-linux)
compiled by GNU C version 4.1.2 20080704 (Red Hat 4.1.2-46).
GGC heuristics: --param ggc-min-expand=90 --param ggc-min-heapsize=113002
Compiler executable checksum: 5db5999ed45fdd052148d72f538724f6
as -V -Qy -o /tmp/cc4vqpfX.o /tmp/ccvBNb7w.s
GNU assembler version 2.17.50.0.6-12.el5 (i386-redhat-linux) using BFD version 2.17.50.0.6-12.el5 20061020
/usr/libexec/gcc/i386-redhat-linux/4.1.2/collect2 --eh-frame-hdr -m elf_i386 --hash-style=gnu -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crt1.o /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crti.o /usr/lib/gcc/i386-redhat-linux/4.1.2/crtbegin.o -L/usr/lib/gcc/i386-redhat-linux/4.1.2 -L/usr/lib/gcc/i386-redhat-linux/4.1.2 -L/usr/lib/gcc/i386-redhat-linux/4.1.2/../../.. /tmp/cc4vqpfX.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i386-redhat-linux/4.1.2/crtend.o /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crtn.o