2
0

c言語のヘッダファイルはなぜコンパイル時にソースファイルと一緒にコンパイルしなくても大丈夫なのか

Last updated at Posted at 2024-04-13

piscine中に疑問に思ったことがありました。
コンパイルするとき
cc -Wall -Wextra -Wall main.c option.c additional.c ...
というようにソースファイルを連ねていくと思うのですが、そのソースファイルに例えばheadder.hという自作のヘッダーファイルをインクルードしていたときにそれも入れなくていいのか?という話です。

最初は名前が同じだから勝手に機械が取り込んでいる(main.cという名前のソースファイルだと大抵main.hというヘッダーファイル名をつける)のかと思っていましたが、どうもそうではないらしい。そうこうしているうちにpiscine中は休む間もなく疑問が生じていき(そしてそれを逐一全部考えようとすると終わる)、この疑問もその一つになっていました。

そして3月のpiscineが終わり、入学式までの約2週間の間piscine中に生じたc言語の疑問・謎のアレコレの整理をしよう!ということになりました。

Q. なぜヘッダファイルはなぜコンパイル時にソースファイルと一緒にコンパイルしなくても大丈夫なのか

A. #include "" でダブルクオーテーションで囲まれた部分のファイル名を探してそれを取り込むから

printfを使用するときに取り込むstdio.h, writeを用いるときのunistd.hなど標準ヘッダファイルと呼ばれるものを取り込む場合は<>で囲みますが、自作のヘッダファイルは""で囲みます。
そうすると、そのソースファイルがある位置を起点として所定の場所におかれたヘッダファイルを取り込めます。
例えば、main.cにheader.hというヘッダーファイルをインクルードしたいとして、main.cとheader.hが同じディレクトリ内にあるなら

#include "header.h"

違うディレクトリなら以下のように
例1:main.cと同じディレクトリにあるincludesというディレクトリの中に場合↓

#include "includes/header.h"

例2:main.cの一つ上のディレクトリと同じ系列のincludesというディレクトリの中に場合↓

#include "../includes/header.h"

そしてこのincludeなる特別な処理をしているのがプリプロセッサなるもので、プリプロセッサ後のソースファイルをコンパイル(翻訳)してリンカ(結合)してプログラムが生成される、という流れです。
※この資料の最初のページの図が分かりやすい
(piscine中の人へ:ライブラリやらオブジェクトファイルやらの話は後半のMakefileの課題で出てきます)

そういえば初めてヘッダファイルなるものを知ったのは始めのチーム課題(rush00)だったな。
あのときは一緒にコンパイルしなくていいファイルがあるのか、ていうちょっとした驚きだった。

以上!

2
0
6

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
2
0