
- C程式設計教程
- C - 首頁
- C語言基礎
- C - 概述
- C - 特性
- C - 歷史
- C - 環境設定
- C - 程式結構
- C - Hello World
- C - 編譯過程
- C - 註釋
- C - 詞法單元
- C - 關鍵字
- C - 識別符號
- C - 使用者輸入
- C - 基本語法
- C - 資料型別
- C - 變數
- C - 整數提升
- C - 型別轉換
- C - 型別強制轉換
- C - 布林值
- C語言中的常量和字面量
- C - 常量
- C - 字面量
- C - 轉義序列
- C - 格式說明符
- C語言中的運算子
- C - 運算子
- C - 算術運算子
- C - 關係運算符
- C - 邏輯運算子
- C - 位運算子
- C - 賦值運算子
- C - 一元運算子
- C - 自增和自減運算子
- C - 三元運算子
- C - sizeof運算子
- C - 運算子優先順序
- C - 其他運算子
- C語言中的決策
- C - 決策
- C - if語句
- C - if...else語句
- C - 巢狀if語句
- C - switch語句
- C - 巢狀switch語句
- C語言中的迴圈
- C - 迴圈
- C - while迴圈
- C - for迴圈
- C - do...while迴圈
- C - 巢狀迴圈
- C - 無限迴圈
- C - break語句
- C - continue語句
- C - goto語句
- C語言中的函式
- C - 函式
- C - 主函式
- C - 按值呼叫函式
- C - 按引用呼叫函式
- C - 巢狀函式
- C - 可變引數函式
- C - 使用者自定義函式
- C - 回撥函式
- C - 返回語句
- C - 遞迴
- C語言中的作用域規則
- C - 作用域規則
- C - 靜態變數
- C - 全域性變數
- C語言中的陣列
- C - 陣列
- C - 陣列的特性
- C - 多維陣列
- C - 將陣列傳遞給函式
- C - 從函式返回陣列
- C - 可變長陣列
- C語言中的指標
- C - 指標
- C - 指標和陣列
- C - 指標的應用
- C - 指標運算
- C - 指標陣列
- C - 指標到指標
- C - 將指標傳遞給函式
- C - 從函式返回指標
- C - 函式指標
- C - 指向陣列的指標
- C - 指向結構體的指標
- C - 指標鏈
- C - 指標與陣列
- C - 字元指標和函式
- C - 空指標
- C - void指標
- C - 野指標
- C - 解引用指標
- C - 近、遠和巨大指標
- C - 指標陣列的初始化
- C - 指標與多維陣列
- C語言中的字串
- C - 字串
- C - 字串陣列
- C - 特殊字元
- C語言中的結構體和聯合體
- C - 結構體
- C - 結構體和函式
- C - 結構體陣列
- C - 自引用結構體
- C - 查詢表
- C - 點(.)運算子
- C - 列舉(或列舉型別)
- C - 結構體填充和打包
- C - 巢狀結構體
- C - 匿名結構體和聯合體
- C - 聯合體
- C - 位域
- C - typedef
- C語言中的檔案處理
- C - 輸入和輸出
- C - 檔案I/O(檔案處理)
- C預處理器
- C - 預處理器
- C - 指令
- C - 預處理器運算子
- C - 宏
- C - 標頭檔案
- C語言中的記憶體管理
- C - 記憶體管理
- C - 記憶體地址
- C - 儲存類別
- 其他主題
- C - 錯誤處理
- C - 可變引數
- C - 命令執行
- C - 數學函式
- C - static關鍵字
- C - 隨機數生成
- C - 命令列引數
- C程式設計資源
- C - 問答
- C - 快速指南
- C - 速查表
- C - 有用資源
- C - 討論
C語言中的宏
C語言中的宏是在編譯預處理器之前,為特定常量值或程式碼語句指定的名稱,並將其替換為其值/程式碼。C宏使用#define預處理器指令定義。
宏可用於程式碼重用、定義常量值、定義行內函數和條件編譯。
本教程將介紹以下不同型別的C宏:
- 類物件宏
- 類函式宏
- 鏈式宏
- 可變引數宏
- 預定義宏
類物件宏
定義常量的宏稱為類物件宏。
語法
使用以下語法:
#define name value
類物件宏示例
在以下示例中,我們定義了一個類物件宏:
#include <stdio.h> // Defining macros #define PI 3.14 #define MAX 10 int main() { // Printing the values printf("Value of PI = %d\n", PI); printf("Value of MAX = %d\n", MAX); return 0; }
類函式宏
要定義類函式宏,您使用相同的“#define”指令,但在宏名稱後立即新增一對括號,其中包含一個或多個引數。此類宏僅在其名稱後出現一對括號時才展開。
當預處理器擴充套件此類宏時,它會將指定的引數合併到替換文字中。類函式宏通常稱為帶引數(或自變數)的宏。
語法
類函式宏定義如下:
#define macro_name([parameter_list]) replacement_text
類函式宏示例
類函式宏的示例如下:
#include <stdio.h> #define square(x) ((x) * (x)) int main(){ int x = 5; printf("x: %d \tSquare of x: %d", x, square(x)); return 0; }
輸出
執行此程式碼時,將產生以下輸出:
x: 5 Square of x: 25
定義類函式宏的規則
定義函式的一些規則也適用於宏:
- 宏可以不帶引數定義
- 宏可以帶固定數量的引數定義
- 宏可以帶可變數量的引數定義
例如,當您使用此類宏時,逗號分隔的引數列表必須包含與宏定義中的引數一樣多的引數。
不帶引數的類函式宏
類函式宏也可以不帶引數定義。
示例1
以下示例演示瞭如何使用不帶引數的宏:
#include <stdio.h> #define MESSAGE() printf("Hello World"); int main() { int x = 5; MESSAGE(); return 0; }
輸出
執行程式碼並檢查其輸出:
Hello World
一些標準庫也在其中提供了宏定義。例如,getchar()宏展開後,實現getc()函式如下:
#define getchar() getc(stdin)
同樣,putchar()宏封裝了putc()函式:
#define putchar(x) putc(x, stdout)
示例2
以下程式定義了一個名為LOOP(x)的宏,並根據其引數執行一個**for**迴圈:
#include <stdio.h> #define LOOP(x) {\ for (int i = 1; i <= x; i++)\ printf("Iteration no: %d\n", i);\ } int main() { int x = 3; LOOP(x); }
輸出
執行此程式碼時,將產生以下輸出:
Iteration no: 1 Iteration no: 2 Iteration no: 3
鏈式宏
當一個宏巢狀在另一個宏中時,它們被稱為鏈式宏。
鏈式宏示例
以下示例演示瞭如何使用鏈式宏:
#include <stdio.h> #define PI 3.142 #define CIRCUMFERENCE(x) (2*PI*x) int main(){ int x = 5; printf("Circumference of a circle with radius %d is %f", x, CIRCUMFERENCE(x)); return 0; }
輸出
執行此程式碼時,將產生以下輸出:
Circumference of a circle with radius 5 is 31.420000
可變引數宏
您還可以定義帶可變數量引數的宏或可變引數宏。帶可變長度引數的宏是一項功能,使宏能夠接受任意數量的引數。您可以將位置引數和關鍵字引數傳遞給宏。
定義可變引數宏時,省略號(…)作為引數傳遞以捕獲可變數量的引數。要使用可變引數宏,省略號可以指定為宏定義中的最後一個形式引數。此標記序列將替換宏體中出現的識別符號__VA_ARGS__。
__VA_ARGS__將被與省略號匹配的所有引數替換,包括它們之間的逗號。請注意,可變引數宏只能在C99相容的C編譯器及更高版本中使用。
可變引數宏示例
請檢視以下示例:
#include <stdio.h> #define MAX_ARGS 5 // Define maximum number of allowed arguments #define ARGS(x, ...) do {\ printf("%d\n", ##__VA_ARGS__); \ } while (0) int main() { ARGS(1, 2, 3); // 3 arguments ARGS(1, 2, 3, 4, 5, 6); // 6 arguments return 0; }
輸出
執行程式碼並檢查其輸出:
2 2
預定義宏
ANSI C定義了許多宏。儘管每個宏都可用於程式設計,但不應直接修改預定義宏。
宏 | 描述 |
---|---|
__DATE__ | 當前日期,以“MMM DD YYYY”格式的字元文字表示。 |
__TIME__ | 當前時間,以“HH:MM:SS”格式的字元文字表示。 |
__FILE__ | 包含當前檔名,以字串文字表示。 |
__LINE__ | 包含當前行號,以十進位制常量表示。 |
__STDC__ | 當編譯器符合ANSI標準時定義為1。 |
示例
以下示例演示瞭如何在C程式中使用預定義宏:
#include <stdio.h> int main() { printf("File :%s\n", __FILE__ ); printf("Date :%s\n", __DATE__ ); printf("Time :%s\n", __TIME__ ); printf("Line :%d\n", __LINE__ ); printf("ANSI :%d\n", __STDC__ ); }
輸出
執行此程式碼時,將產生以下輸出:
File: main.c Date: Mar 6 2024 Time: 20:12:19 Line: 8 ANSI: 1