クイックリファレンス

C言語プリプロセッサ (cpp) マクロとディレクティブチートシート

C言語プリプロセッサ(cpp)の構文リファレンス:ヘッダーインクルード、マクロ定義、トークン連結(##)、文字列化(#)、条件付きコンパイル。

· 公開日

C/C++ コンパイルツールチェーン内で自動実行されるほか、単体コマンドとしても呼び出し可能な C言語プリプロセッサ (cpp) の構文チートシート。

単体プリプロセッサの実行

コンパイラを通さずにマクロ展開のみを直接実行:

# -P オプションで linemarker 行情報の出力を抑制
cpp -P source.c > preprocessed.c

ヘッダーファイルのインクルード

#include <stdio.h>      /* システムおよび標準ライブラリのヘッダー */
#include "my_header.h"  /* プロジェクト内のローカルヘッダー */

マクロ定義

#define BUFFER_SIZE 1024
#define PI 3.1415926535

/* マクロ定義の解除 */
#undef BUFFER_SIZE

関数形式マクロ (Function-Like Macros)

#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define DEG_TO_RAD(x) ((x) * 0.0174532925)

文字列化演算子 (#)

単一の # 演算子はマクロ引数を文字列リテラルに自動変換します:

#define STR(name) #name
#define PRINT_VAR(x) printf("%s = %d\n", #x, x)

char *var_name = STR(my_object);  /* → "my_object" */

トークン連結演算子 (##)

二重の ## 演算子は2つのトークンを結合して1つの新しい識別子にします:

#define COMMAND(NAME) { #NAME, NAME ## _command }

struct command commands[] = {
  COMMAND(quit),   /* → { "quit", quit_command } */
  COMMAND(help)    /* → { "help", help_command } */
};

条件付きコンパイル (Conditional Compilation)

#ifdef DEBUG
  #define LOG(msg) printf("[DEBUG] %s\n", msg)
#elif defined(VERBOSE)
  #define LOG(msg) printf("[INFO] %s\n", msg)
#else
  #define LOG(msg) /* noop */
#endif

/* 多重インクルード防止ガード (Include guards) */
#ifndef MY_HEADER_H
#define MY_HEADER_H

/* ここに各種宣言を記述 */

#endif /* MY_HEADER_H */

診断メッセージとコンパイル警告

#if __STDC_VERSION__ < 201112L
  #warning "C11 features are not fully enabled"
#endif

#if !defined(REQUIRED_CONFIG)
  #error "REQUIRED_CONFIG must be defined before compilation"
#endif

標準の定義済みマクロ一覧

  • __FILE__: コンパイル中の現在のソースファイル名(文字列)。
  • __LINE__: 現在のソース行番号(整数値)。
  • __DATE__: コンパイル実行日("Mmm dd yyyy" 形式の文字列)。
  • __TIME__: コンパイル実行時刻("hh:mm:ss" 形式の文字列)。

関連テーマ