帶參巨集與函數形式相似,但本質截然不同:
// 函數版本:正確輸出 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;
調用時將多語句替換到原始碼中。