簡體   English   中英

在 C 中使用嵌套宏

[英]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));

這一切都很好。 並不意味着您應該使用此類宏。 使用簡單的函數,讓編譯器完成類型檢查和內聯它認為最好的工作。

您的宏有幾個問題:

  • 永遠不要隱藏; 在宏內部,但讓它表現得像一個普通的語句
  • 不要編寫多次評估其 arguments 的宏
  • 始終在宏參數周圍加上括號,以便您知道所有運算符的優先級。

您的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM