C言語 プリプロセッサ【絶対知るべき3大機能を順に解説する】

C言語
この記事は約8分で読めます。

こんにちは、ナナです。

ここまでに皆さんは様々なプログラムを作ってきましたことでしょう。

本記事では、プログラムを作った結果として最終的に作り出される「実行ファイル」の製作工程について深堀りしていきます。

本記事では次の疑問点を解消する内容となっています。

本記事で学習できること
  • プログラムから作り出される実行ファイルって何?
  • 実行ファイルを作るってどんな製作工程で行われるの?
  • 製作工程に関わる担当ってどんな人達がいるの?
  • プリプロセッサ・コンパイラ・リンカって何?
  • プリプロセッサが持つ3大機能って何?

では、プリプロセッサの役割を学んでいきましょう。

スポンサー

プリプロセッサから始まる出版作業

はい、はーーい。ふと思ったんです。僕が作ったプログラムってなんで動くんですか?「ビルド」っていったい何なんですか?

急に気になって眠れなくなったんです!僕を不眠症から救ってください‼

ナナ
ナナ

いい傾向だね。成長したことで様々なことが見えるようになったんだね。そうなることで、さらなる疑問が生まれてくる。これが成長のサイクルだよ。

じゃあ、今日は君が作ったプログラムが、どのような工程を経てコンピュータ上で動くのかを学んでいこうね。

皆さんが作りだすソースコードと呼ばれるプログラムは、様々な工程を経てコンピュータ上で動く姿へと変化します。

目標は実行ファイル

最終的なゴールは「実行ファイル」と呼ばれる、コンピュータ上で動作するファイルを作り出すことです。この製作工程を学びましょう。

実行ファイルという本が出版されるまでの流れ

皆さんの手で「ソースコード」が作られ「実行ファイル」が出来上がるまでの製作工程とは、作家の原稿が本として出版されるまでの流れと似ています。

出版社

最近の漫画は海外向けにも出版されていますが、その製作工程は次のようなものでしょう。

海外向けの出版

皆さんが作り出した「ソースコード」という名の原稿は、最終的に「実行ファイル」という出版物の本に変化します。

コンピュータが動くとは、その本を読んで書いてある通りに処理を動かしているのです。

はい、はい、はーい。どうして海外版なんですか?僕は日本語の漫画しか読みません!英語に翻訳されたら僕は読めませんっ‼

ナナ
ナナ

「翻訳」という工程が必要なのは、人ではなくコンピュータに向けた出版物だからだね。

コンピュータはC言語という言葉を、直接読むことができないんだよ。誰のための出版物なのか、それが「翻訳」が必要な理由だね。

製作に欠かせない担当

実行ファイルを作る製作工程で、欠かせない担当がいます。それが次の3つの担当です。

実行ファイルの製作工程で活躍する担当
  • プリプロセッサ ・・・編集担当
  • コンパイラ   ・・・校正・翻訳担当
  • リンカ     ・・・製本担当
実行ファイル製作工程

これらの担当はコンピュータ上では「ツール」として実在します。つまり、担当自身も実行ファイルというツールです。

各担当はC言語の開発環境に含まれており、今まで皆さんは実はこっそりお世話になっていた担当達なのです。

本記事では、ソースコードを最初に編集する「プリプロセッサ」について語っていきましょう。

ナナ
ナナ

統合開発環境の「ビルド」とは、この3つの工程を動かして「実行ファイル」を作り出すことなんです。

スポンサー

実行ファイルの製作工程を工場見学するぞ!

ほーーい。僕の一生懸命作った「ソースコード」は、ど、ど、ど、どんな工程で実行ファイルに変わっていくんですか?

工場見学がしてみたいでーす!

ナナ
ナナ

じゃあ、君の作ったソースコードがどのように変化していくのか、もう少し詳しく見ていこうね。各担当のツールによって、少しずつ作り変えられていくんだよ!

「ソースコード」というものは、各担当に渡されて加工され、さらに次の担当に渡されていきます。その具体的な流れを把握しましょう。

製作工程を知る必要性

ここまでの開発では「プリプロセッサ」「コンパイラ」「リンカ」というツールの存在を、特に意識することなく開発をしてきました。

それができたのは「統合開発環境」が、皆さんからこれらのツールの存在を隠してきたからにすぎません。

Windowsアプリ開発やスマートフォンアプリ開発など、今どきのソフトウェアを作る際は統合開発環境を使うことがほとんどですが、組み込み開発では統合開発環境を使う機会は少ないです。

Makefileを使った製作工程

一般的に組み込み開発では「Makefileメイクファイル」と呼ばれる、コンパイラとリンカへの指示書を作成して実行ファイルを作成します。

統合開発環境が使えない開発では、コンパイラやリンカを直接使って実行ファイルの作成を皆さんが行わなくてはなりません。

そのため、組み込み開発者は各ツールが何をするものなのか、しっかりと把握しておかなければならないのです。

実行ファイルの製作工程

皆さんが作ったソースファイルは、いくつかの工程を経て実行ファイルが生成されます。

実行ファイルの詳細製作工程
ソースファイル皆さんが作るC言語のファイル。複数ファイルも可能。
前処理済みソースファイル前処理をして加工されたソースファイル
オブジェクトファイルコンパイラが生成する機械語のファイル
ライブラリファイル外部提供される関数が含まれるファイル
実行ファイルコンピュータで実行可能なファイル
ナナ
ナナ

プリプロセスとコンパイルはソースファイル単位で実施され、リンクは全体で1回だけ実施されるんですよ。

各担当となるツールの役割を紹介

各ツールは次の役割を請け負っています。特徴を押さえておきましょう。

プリプロセッサ(編集)

プリプロセッサ
役割

ソースファイルを翻訳できる形に編集・成形する。

仕事の成果物

原稿として渡された「ソースコード」に必要な前処理を行う。「前処理済みソースコード」とは、次工程のコンパイラが翻訳できる状態になるように加工されたファイルのこと。

コンパイラ(校正・翻訳)

コンパイラ
役割

ソースコードの文法が正しいかをチェックし、コンピュータが理解できる機械語に翻訳する。

仕事の成果物

プリプロセッサから渡される「前処理済みソースコード」を加工し、次工程のリンカに渡す「オブジェクトファイル」を生成する。

リンカ(製本・出版)

リンカ
役割

バラバラに存在する関数や変数といったプログラム部品を、1つに結合しファイルに統合する。

仕事の成果物

コンパイラが渡される複数の「オブジェクトファイル」と、外部から提供される「ライブラリファイル」を結合し、最終成果物の「実行ファイル」を生成する。

ナナ
ナナ

皆さんの知らないところで、いろんなツールが活躍して実行ファイルを作り出しているんです。

スポンサー

プリプロセッサ 役割と3大機能の紹介

ほほほーい。プリプロセッサ、なんか響きがかっこいいです。プリプロセッサ、何回も言いたくなります。僕はプリプロセッサのようなやつになりたいのですっ!

で、で、で、「プリプロセッサ」の仕事ってどんな仕事なんですか?

ナナ
ナナ

「プリプロセッサ」はみんなが作ったソースコードを最初に加工する担当だよ。ソースコードを切り貼りしながら編集するのが仕事だね。

プリプロセッサの仕事は、コンパイラが翻訳作業をするための「プリプロセス」を行うことです。

プリプロセッサが持つ機能

プリプロセスとは「前:プリ」「処理:プロセス」であり、プリプロセッサとは「前処理を行う者」と定義されます。

実は「プリプロセッサ」というツールは単体で存在せず、コンパイラの中に含まれています。そのため、コンパイラを動かすことで、自動でプリプロセスが行われます。

コンパイラに含まれるプリプロセッサ

プリプロセッサには3つの大きな機能があります。いずれも大事な機能ですので、しっかりと覚えましょう。

プリプロセッサ3大機能
  • #define マクロ定義
  • #include インクルード
  • #ifdef 条件コンパイル

プリプロセッサが関わる機能は、「#」から始まるキーワードに関するものです。

プリプロセッサの各機能は、C言語のプログラミングにおいて非常に重要なものばかりです。語るにはボリュームが結構必要ですので、それぞれ個別の記事にまとめてあります。

ナナ
ナナ

この3つの記事はゲスト講師による特別講義ですよ。普段とちょっと違う講義内容になってます!

各機能だけに興味がある方は、ここからリンク先にジャンプしてください。C言語入門カリキュラムを受講している方は、このまま読み進めてください。

スポンサー

Q&A:プリプロセッサに関するよくある質問

ナナ
ナナ

プリプロセッサに関する疑問・質問なんでもござれ!

Q:プリプロセッサの仕事は3大機能のみ?他にもあるの?

ほいさ、ほーい。我が憧れの職業、プリプロセッサ。その仕事は3大機能を覚えさえすればよいのでしょうか?

ナナ
ナナ

実は3大機能以外にも、みんなにとって身近なものを処理する仕事があるんだよ。

皆さんプログラムの中で「コメント機能」を使いますね。コメントとは私たち開発者がプログラムを読みやすくするための機能であり、コンピュータにとっては不要なものです。

プリプロセッサは、このコメントをソースコードから削除する機能も持っています。

#include <stdio.h>

int main(void)
{
	/* Helloを表示 */
	printf("Hello");

	return 0;
}
ナナ
ナナ

こんな身近なコメント機能も、実はプリプロセッサが動いているからこそ使えるのです。