[英]Using Nested macros in C
#include "stdafx.h"
#include<stdio.h>
#define PR(x) printf("%d\t",(int)(x));
#define PRINT(a,b,c) PR(a) PR(b) PR(c)
#define MAX(a,b) (a<b?b:a)
int main()
{
int x=1,y=2;
//PR(MAX(x++,y));
PRINT(MAX(x++,y),x,y); //2,2,2
PRINT(MAX(x++,y),x,y); //2,3,2
return 0;
}
x
為 1,因此在 PRINT 中作為 arguments 傳遞的 3 個值是 2 2 2。
然后在第二個 PRINT 中,將傳遞的值是 2 3 2。所以 output 應該是 2 2 2 2 3 2。但是這個程序輸出為 2 2 2 3 4 2。
你的MAX
宏不好。 它評估其 arguments 之一兩次。
MAX(x++,y)
擴展為:
(x++ < y ? y : x++)
^^^
因此,如果 x 開始時小於y
,則x
會增加兩次。
該代碼中沒有未定義的行為,因為在三元運算符的第一部分的評估和被選擇的部分之間存在一個序列點。 整個PRINT
表達式擴展為:
printf("%d\t", (x++ < y ? y : x++));
printf("%d\t", (x));
printf("%d\t", (y));
這一切都很好。 這並不意味着您應該使用此類宏。 使用簡單的函數,讓編譯器完成類型檢查和內聯它認為最好的工作。
您的宏有幾個問題:
;
在宏內部,但讓它表現得像一個普通的語句您的MAX(x++,y)
調用轉換為(x++<y?y:x++)
並導致在第一次調用期間對x
進行雙重修改。
PRINT((MAX(x++,y),x,y) -> PR(MAX(x++,y)) PR(x) PR(y) -> PR(x++
x = 1, y = 2 執行 PR(2 因為 1<2) 並將 x 增加到 2 然后 PR(2) PR(2) - 因此 output 2 2 2
下一個 PR(MAX(x++ (ie2) < 2 - false)? 2: x++ (即使用條件 (3) 中 x 的增量值,然后 output 3 並將 x 增量為 4) - 因此 x 增加了兩次
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.