C言語 プリプロセッサとマクロ: #include, #define, 条件付きコンパイルをマスター
C言語 プリプロセッサとマクロ
C言語のプリプロセッサの力を探る:ヘッダインクルード、定数/関数マクロ定義、条件付きディレクティブによるコンパイルフロー制御。

Cプリプロセッサはコンパイラの前に実行され、マクロ展開、ヘッダファイルインクルード、条件文評価によりソースコードを変換します。柔軟で再利用可能なコードを書くための必須ツールです。
すべてのプリプロセッサディレクティブは#シンボルで始まります。例:
#define PI 3.14
ヘッダファイルのインクルード: #include
#includeディレクティブは、ヘッダファイルの内容をソースファイルに直接挿入します。一般的な用法:
#include <stdio.h>
#include <stdio.h>なしでは、printf()やscanf()は未定義になります。独自ヘッダも作成可能:
#include "my_header.h"
独自ヘッダは関連関数宣言と定数のグループ化に便利です。
定数と式の定義: #define
マクロは、トークンや式をコンパイル前に値で置換します。例:
#define c 299792458 /* 光速 */
プログラム内でcを使うと299792458に展開されます。
例1: PIの定義
#include <stdio.h>
#define PI 3.1415
int main() {
float radius, area;
printf("半径を入力: ");
scanf("%f", &radius);
area = PI * radius * radius;
printf("Area=%.2f", area);
return 0;
}
関数風マクロ
マクロは引数を取れ、インライン関数のように機能します:
#define circleArea(r) (3.1415 * (r) * (r))
circleArea(5)は(3.1415 * 5 * 5)に展開されます。
例2: 関数風マクロの使用
#include <stdio.h>
#define PI 3.1415
#define circleArea(r) (PI * (r) * (r))
int main() {
float radius, area;
printf("半径を入力: ");
scanf("%f", &radius);
area = circleArea(radius);
printf("Area = %.2f", area);
return 0;
}
条件付きコンパイル
条件付きディレクティブを使うと、実行前ではなくコンパイル時にコードブロックをインクルード/除外できます。if文に似ていますが、事前に評価されます。
主なユースケース
- 異なるOSやハードウェアへの対応。
- ランタイムオーバーヘッドなしのデバッグビルド作成。
- 参照用のレガシーコードパス維持。
主要ディレクティブ
#ifdef MACRO /* MACRO定義時のコード */ #endif
#if EXPRESSION /* EXPRESSION非ゼロ時のコード */ #else /* ゼロ時のコード */ #endif
#if EXPRESSION /* コード */ #elif ANOTHER_EXPRESSION /* 代替コード */ #else /* フォールバックコード */ #endif
#if defined BUFFER_SIZE && BUFFER_SIZE >= 2048 /* バッファが十分大きい */ #endif
事前定義マクロ
| マクロ | 値 |
|---|---|
__DATE__ | コンパイル日の文字列 |
__FILE__ | 現在のファイル名の文字列 |
__LINE__ | マクロが出現する行番号 |
__STDC__ | ANSI C標準準拠なら非ゼロ |
__TIME__ | コンパイル時刻の文字列 |
例3: コンパイル時刻の表示
#include <stdio.h>
int main() {
printf("Current time: %s", __TIME__);
return 0;
}
出力例:
Current time: 19:54:39
推奨リーディング
- Line Control
- Pragmas
- Preprocessor Output
- Other Directives
C言語
- 交流回路における抵抗器、インダクタ、コンデンサの包括的まとめ
- C# キーワードと識別子:ルール、一覧、ベストプラクティス完全ガイド
- C# クラスとオブジェクト:堅牢な OOP の基礎
- C# 抽象クラスと抽象メソッドをマスターする:実践ガイド
- C# 部分クラスと部分メソッドを理解する
- C# sealed クラスとメソッドをマスターする:使用判断、実例、コードの安全性とパフォーマンス向上
- C#プリプロセッサディレクティブ完全ガイド:条件付きコンパイルと診断制御
- C言語キーワードと識別子:実践ガイド
- C言語の定数とリテラル:型、使い方、ベストプラクティス
- C言語の入出力マスター:標準関数とファイル操作
- C言語プリプロセッサ(CPP)の理解:コンパイルをシンプルにする仕組み