在noip中,巨集還是被經常採用,所以這裡講一下,c++中巨集的定義與用法
第一種用法——配合條件編譯:#define debug
定義乙個叫debug的識別符號。它應該與#ifdef或#ifndef配合使用。舉例如下:
#define debug#ifdef debug
void print(int v)
#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') \
不要忘記每行後面的「\」,它相當於換行符。這次move簡化了一大段**。當然,在c++中內聯函式也可以實現這種功能的。
C 內聯函式與巨集定義
用內聯取代巨集 1.內聯可除錯 2.可進行型別安全檢查或自動型別轉換 3.可訪問成員變數。另外,定義在類宣告中的成員函式自動轉化為內聯函式。文章 一 內聯函式與巨集定義 在c中,常用預處理語句 define來代替乙個函式定義。例如 define max a,b a b a b 該語句使得程式中每個出...
C 中的內聯函式(inline)與巨集定義
當我們定義完乙個函式之後,實際呼叫的時候,函式體本身會壓入堆疊,主函式再從堆疊裡面把這部分內容提取出來,產生一定的系統開銷,對於大型函式來說,這部分開銷可能相對於函式體本身執行的開銷來說微乎其微。但是如果乙個函式僅僅只是為了完成乙個特別簡單的功能,比如交換兩個變數的值,亦或是求兩個變數的最大值,這時...
巨集定義中 與 的用法
巨集定義中 的功能是將其後面的巨集引數進行字串化操作 stringfication 舉個例子就明白了 define warn if exp do while 0 使用warn if divider 0 被替換為 do while 0 ok,講 了,連線符 concatenator 用來將兩個toke...