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

C 語言帶參巨集與函數的本質區別:字串替換 vs 程式碼執行

     編輯:C 語言基礎

帶參巨集與函數形式相似,但本質截然不同:

  • 巨集:預處理階段純字串替換,不計算運算式,不佔記憶體,不參與編譯。
  • 函數:編譯為機器碼,分配記憶體,每次呼叫執行該記憶體區塊程式碼。

經典陷阱:副作用差異

// 函數版本:正確輸出 1^2~5^2
int SQ(int y) { return (y)*(y); }
while (i <= 5) printf("%d^2 = %d\n", i-1, SQ(i++));

// 巨集版本:輸出 3^2=1, 5^2=9, 7^2=25
#define SQ(y) ((y)*(y))
while (i <= 5) printf("%d^2 = %d\n", i, SQ(i++));

巨集 SQ(i++) 展開為 ((i++)*(i++)),i 每次遞增 2,導致迴圈次數減半、結果錯誤。函數先傳值再遞增,無此問題。

多語句巨集

#define SSSV(s1,s2,s3,v) \
    s1 = length * width; \
    s2 = length * height; \
    s3 = width * height; \
    v = width * length * height;

調用時將多語句替換到原始碼中。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved