像定義“函數”一樣定義宏

來源:互聯網
上載者:User

    可以使用宏定義沒有傳回值的“函數”。例如:

#define PrintMax(a, b) /    do /    { /        int x = a, y = b; /        printf("Max: %d/n", x > y ? x : y);/    } while (0)// ...PrintMax(3, 4);

    這樣的“函數”與真正意義上的函數有本質的區別,因為宏是一個編譯前行為,僅僅是編譯前對文本進行替換。在Python源碼中,經常可以看到下面類似的宏定義:

#define foo(x) /    do { /        ... /    } while (0)

    為什麼要使用do { ... } while (0)這樣的文法而不直接使用 { } 呢?定義了上面這個宏,我們就可以在代碼中使用類似這樣的代碼:foo(3); 注意結尾的分號,它看起來很像一個函數,實現上它表示一條語句。如果使用 { } 來代替 do { ... }  while (0),那麼使用分號顯然是個語法錯誤。

    使用宏時,有幾點要特別注意:

  • 要特別留心空格。下面的兩個宏是一樣的:
#define foo(x) (x << 2)#define boo (x) (x << 2)  //注意括弧前面的空格
  • 用宏給類型取別名與typedef有很大的區別。例如:
#define INT int *INT p1, p2; // p1是指標,p2是一個int變數typedef  int * INT;INT p1, p2; // p1, p2都為指標//---------------------------------------------------#define LONG longunsigned LONG v1;  // v1是一個無符號的long變數typedef long LONG;unsigned LONG v1; // 錯誤哦~~~

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.