首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言預處理器宏定義完全指南:無參、帶參、嵌套與常見陷阱

     編輯:關於C語言

宏定義基礎

宏定義由 #define 完成,預處理階段進行單純文本替換(宏展開),不進行語法檢查。

無參宏

#define M (y*y+3*y) // 括號不可省
#define PI 3.1415926
#define S PI*y*y    // 嵌套使用已定義宏

注意:宏定義行尾不加分號,否則分號也會被替換;宏名若在引號中不展開。

帶參宏

#define MAX(a,b) ((a) > (b) ? (a) : (b))
#define SQ(y) ((y)*(y))

關鍵規則:

  1. 宏名與參數表間不能有空格:#define MAX(a,b) ✓,#define MAX (a,b) ✗(視為無參宏)。
  2. 形參不分配內存、無類型,實參可為表達式,直接文本替換(非求值傳遞)。
  3. 形參兩側與整體表達式均需加括號,防止優先級錯誤:#define SQ(y) ((y)*(y))。
  4. 帶副作用實參(如 i++)會導致多次求值,與函數行為不同。

宏定義多語句

#define SSSV(s1,s2,s3,v) s1=l*w; s2=l*h; s3=w*h; v=w*l*h;

宏與 typedef 的區別

#define PIN1 int*
typedef int* PIN2;

PIN1 a, b;  // 展開為 int *a, b;  b 是 int
PIN2 a, b;  // a、b 均為 int*

取消宏定義

#define PI 3.14
#undef PI // 後續代碼 PI 無效

最佳實踐建議

  • 宏名全大寫,便於識別。
  • 複雜表達式優先用 inline 函數或 constexpr (C++) 替代。
  • 避免宏定義類型別名,改用 typedef。
  • 善用 do { ... } while(0) 包裹多語句宏,使其語義上如單語句。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved