C 預處理器(CPP) 是編譯流程中獨立的一步,本質上是一個強大的文本替換工具。它在正式編譯前處理源代碼,所有指令均以 # 開頭(建議從第一列開始)。
| 指令 | 功能描述 |
|---|---|
#define | 定義宏(常量或函數式宏) |
#include | 包含外部文件內容 |
#undef | 取消已定義的宏 |
#ifdef / #ifndef | 檢查宏是否定義 |
#if / #else / #elif / #endif | 條件編譯控制塊 |
#error | 輸出編譯錯誤訊息 |
#pragma | 向編譯器發送特殊指令 |
#define MAX_ARRAY_LENGTH 20
所有 MAX_ARRAY_LENGTH 會被替換為 20。
#include <stdio.h> // 系統庫
#include "myheader.h" // 本地目錄
#undef FILE_SIZE
#define FILE_SIZE 42
#ifndef MESSAGE
#define MESSAGE "You wish!"
#endif
#ifdef DEBUG
/* 調試代碼 */
#endif
編譯時加 -DDEBUG 即可啟用調試代碼,無需修改源碼。
| 宏 | 含義 |
|---|---|
__DATE__ | 編譯日期("MMM DD YYYY") |
__TIME__ | 編譯時間("HH:MM:SS") |
__FILE__ | 當前源文件名 |
__LINE__ | 當前行號 |
__STDC__ | ANSI 標準編譯時為 1 |
\長宏換行使用:
#define message_for(a, b) \
printf(#a " and " #b ": We love you!\n")
#將宏參數轉為字符串字面量:
#define message_for(a, b) \
printf(#a " and " #b ": We love you!\n")
// message_for(Carole, Debra) 展開為:
// printf("Carole" " and " "Debra" ": We love you!\n");
##合併兩個標記:
#define tokenpaster(n) printf("token" #n " = %d", token##n)
// tokenpaster(34) → printf("token34 = %d", token34);
defined() 運算符在常量表達式中檢查宏是否定義:
#if !defined(MESSAGE)
#define MESSAGE "You wish!"
#endif
宏可接受參數,注意括號保護優先級:
#define square(x) ((x) * (x))
#define MAX(x, y) ((x) > (y) ? (x) : (y))
使用時如同函數調用,但無類型檢查,需謹慎使用副作用表達式。