1. 程式人生 > >【C++學習筆記】C++巨集的定義用法總結

【C++學習筆記】C++巨集的定義用法總結

本文轉載自:https://www.cnblogs.com/jjzzx/p/5122494.html

  1. 第一種用法——配合條件編譯:#define DEBUG

定義一個叫DEBUG的識別符號。它應該與#ifdef或#ifndef配合使用。舉例如下:

#define DEBUG
#ifdef DEBUG
    void print(int v) { cout << v << endl;}
#else
    void print(int) {}
#endif

 如果符號DEBUG存在,那麼編譯器會編譯上面的、能輸出數值的print,否則編譯器編譯下面的、什麼事情都不做的print。

把上面的#ifdef換成#ifndef,那麼編譯的程式碼正好上面所說的相反。

    2.第二種用法——表示式

#define N  5000

  編譯時,編譯器會用類似於“查詢和替換”的方法,把程式碼中的N換成5000。如果需要換成表示式,應該用括號把它們包圍。例如:

#define a   1+2

#define b   (1+2)

c=a*2; d=b*2;

編譯時上面一行會變成“c=1+2*2; d=(1+2)*1;”,顯然它們的值是不同的。

此外,要注意表示式末尾不能有分號(除非你需要)。

   3.第三種用法——簡易“函式”

#define FtoC(a) (((a)-32)/9*5)

這類似於一個函式。不過,由於編譯器只是進行簡單替換,所以為了安全,a、b應該用括號包圍,整個表示式也應該用括號包圍。

這種“函式”用法和普通函式一樣,且速度更快。然而,它很容易出現難以查出的錯誤。所以,請用行內函數(inline)代替巨集定義。

注意,不要在“引數”中改變變數的值

  4.第四種用法——簡化一段程式碼

#define move(dx, dy)    if (isfull(dir)) return;    \
            if (map(x+dx, y+dy)=='0')   \
            {                       \
                push(dir,x+dx,y+dy,head[dir], dep); \
                check(dir);             \
            }

 不要忘記每行後面的“\”,它相當於換行符。這次move簡化了一大段程式碼。當然,在c++中行內函數也可以實現這種功能的。