C 中巨集的定義與用法(現已被內聯函式所代替)

2022-08-21 22:45:13 字數 1169 閱讀 2199

在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...