#include 是什麼?以 # 開頭的行稱為 預處理指令,在編譯器正式編譯前由預處理器處理。常見指令:
| 指令 | 作用 | 範例 |
|---|---|---|
#include | 引入標頭檔內容(函數宣告、巨集、型別定義) | #include <stdio.h>、#include "myheader.h" |
#define | 定義巨集常數或函數式巨集 | #define PI 3.14159、#define MAX(a,b) ((a)>(b)?(a):(b)) |
#ifdef/#ifndef/#endif | 條件編譯,防止標頭檔重複包含 | #ifndef HEADER_H\n#define HEADER_H\n...\n#endif |
#pragma | 編譯器特定指示(如對齊、優化、訊息抑制) | #pragma once、#pragma pack(1) |
// 預處理指令區
#include <stdio.h> // 標準輸入輸出庫
#include <stdlib.h> // 標準庫:記憶體、轉換、程式控制
// 全域變數/函數宣告區(可選)
#define MAX_SIZE 100
int global_var = 0;
void my_function(int param);
// 主函數:程式進入點
int main() {
// 區域變數宣告
int a = 10;
float b = 3.14f;
// 執行語句
printf("Hello, C!\n");
printf("a = %d, b = %.2f\n", a, b);
// 返回值:0 表示成功
return 0;
}
// 函數定義區
void my_function(int param) {
// 實作...
}
| 特性 | 說明 | 對開發者的意義 |
|---|---|---|
| 靜態型別 | 變數型別編譯期確定,不可變 | 編譯器捕捉型別錯誤,產生高效機器碼 |
| 過程式導向 | 以函數為基本模組單位 | 適合演算法實作、系統程式、嵌入式開發 |
| 手動記憶體管理 | malloc/free、堆疊自動變數 | 精確控制資源,無 GC 暫停,但需自防洩漏 |
| 指標與位址運算 | 直接操作記憶體位址 | 實現動態資料結構、硬體介面、零拷貝 |
| 預處理器 | 文字替換、條件編譯、檔案包含 | 跨平台適配、程式碼生成、除錯開關 |
| 極小執行時 | 無虛擬機、無重型庫、啟動極快 | 適合裸機、啟動載入器、容器基礎映像 |
| 標準化 | ANSI C89、C99、C11、C17、C23 | 代碼可移植,編譯器互通 |
printf("Hello World\\n"); 理解編譯→執行流程。void main()、gets()、conio.h、system("pause")——這些非標準、不安全、不可移植。gcc -Wall -Wextra -pedantic -std=c17 -O2 -g。NULL,malloc 必檢查,free 後置 NULL。snprintf、strncpy、fgets,拒絕緩衝區溢位。「C 語言語法簡潔,核心概念少(變數、型別、控制流、函數、指標、結構體、預處理器),但每個概念都直通硬體本質。把這幾個概念真正搞懂、寫熟,你就擁有了『看透軟體底層』的能力。」