C 程式原始碼中可包含各種編譯指令,稱為預處理命令。雖然它們不是 C 語言核心的一部分,但擴展了程式設計環境。ANSI 標準定義的預處理命令包括:
#define、#error、#include#if、#else、#elif、#endif#ifdef、#ifndef、#undef#line、#pragma所有預處理命令均以 # 開頭。
定義一個標識符及其替換字串。一般形式:#define identifier string(無分號)。
#define TRUE 1
#define FALSE 0
#define PI 3.14159
#define MAX_SIZE 100
宏名可用於其他宏定義中:
#define ONE 1
#define TWO ONE+ONE
#define THREE ONE+TWO
帶參數的宏(類函數宏):
#define MIN(a,b) ((a)<(b)?(a):(b))
優點:避免函數調用開銷,提高速度。缺點:重複編碼增加程式長度,需注意副作用(如 MIN(x++, y) 會導致 x 增加兩次)。
用於程式除錯,強制編譯器停止並顯示錯誤訊息。
#include "stdio.h" // 先搜尋當前目錄,再搜尋標準目錄
#include <stdio.h> // 僅搜尋標準目錄
支援嵌套包含,嵌套層數視實作而定。
根據常量表達式的真偽決定是否編譯特定程式碼區塊。表達式必須為常量,不能包含變數或 sizeof。
#define MAX 100
#if MAX > 99
printf("Large array\n");
#else
printf("Small array\n");
#endif
#ifdef MACRO:若宏已定義則編譯後續程式碼。
#ifndef MACRO:若宏未定義則編譯後續程式碼。
常用於防止頭檔案重複包含:
#ifndef HEADER_H
#define HEADER_H
// 頭檔案內容
#endif
取消先前定義的宏,將其作用域限制在特定程式碼段:
#define LEN 100
#define WIDTH 100
char array[LEN][WIDTH];
#undef LEN
#undef WIDTH
// 此處 LEN 與 WIDTH 已無定義
改變 __LINE__ 與 __FILE__ 預定義宏的值,主要用於除錯:
#line 100 "custom.c"
printf("%d\n", __LINE__); // 輸出 102
向編譯器傳遞特定指令(如啟用/停用警告、指定對齊方式等),各編譯器支援不同。
__LINE__:當前行號__FILE__:當前檔案名__DATE__:編譯日期("Mmm dd yyyy")__TIME__:編譯時間("hh:mm:ss")__STDC__:標準編譯器為 1,否則為其他值註解以 /* 開始,以 */ 結束,不可嵌套。編譯器會忽略註解內容。
/* 這是合法的註解 */
printf("hello"); /* 行尾註解 */
x = 10 + /* 運算式中註解 */ 5; // 合法但不建議
注意事項:
swi/*comment*/tch 非法)/* */ 會導致編譯錯誤