C 語言的編譯過程可分為四個階段:預處理、編譯、匯編、鏈接。其中預處理階段包含文件包含(#include)、條件編譯(#if/#ifndef/#endif)與宏定義(#define)三大功能。宏的本質是文本替換,發生在編譯之前,因此不佔用運行時內存,但也因缺乏類型檢查而需謹慎使用。
語法:#define 標識符 字符串。常用於定義常量,提升可維護性(修改一處即全局生效)與可讀性(語義化名稱替代魔術數字)。
#include <stdio.h>
#define PI 3.1415
void main() {
printf("PI常量的值:%f", PI);
}
經預處理後,PI 會被直接替換為 3.1415。可通過編譯器選項(如 GCC 的 -E)查看預處理輸出驗證。
語法:#define 標識符(參數表) 字符串。關鍵點:宏不是函數,不進行運算,僅做文本替換。
#define AREA(x,y) x*y // 調用 AREA(a+b, a-b) 將展開為 a+b*a-b,而非 (a+b)*(a-b)
解決方案:在宏定義中給參數與整體表達式加括號:#define AREA(x,y) ((x)*(y))。
PI 精度只需改一行。MAX_BUFFER 比 1024 更清晰表達意圖。結構體(struct)允許將不同類型的變量組合成一個自定義類型,類似於其他語言中的「對象」或「記錄」。
// 顯式聲明:定義類型標籤,可復用
struct Student {
char name[20];
int age;
};
struct Student s1; // 實例化
// 匿名聲明:直接定義變量,類型無名,通常僅用一次
struct {
char name[20];
int age;
} s2;
使用 . 運算符訪問成員。注意:字符數組不能直接賦值(s.name = "張三" 錯誤),需用 strcpy() 或逐字符賦值。
typedef 為現有類型創建別名,不創建新類型,原類型名仍可使用。常見用途:
typedef int Integer; typedef double Double; Integer i = 1; // 等同於 int i = 1;
// 顯式結構體 + typedef
typedef struct Student {
char name[20];
int age;
} StuType;
// 匿名結構體 + typedef(更常見)
typedef struct {
char name[20];
int age;
} StuType;
StuType student; // 直接使用別名,無需 struct 關鍵字
總結:宏用於編譯期文本替換,結構體封裝異構數據,typedef 提供類型抽象層。三者配合構建了 C 語言靈活的類型系統基石。