天天看點

c語言中d的作用是什麼,C語言/ C++中宏定義是什麼?有什麼作用呢?

1、條件編譯

C語言中,預處理過程讀入源代碼,檢查包含預處理指令的語句和宏定義,并對源代碼進行相應的轉換,預處理過程還會删除程式中的注釋和多餘的空白符号。預處理指令是以#開頭的代碼行,#必須是該行除了空白字元外的第一個字元。#後是指令關鍵字,在#和指令關鍵字之間允許存在若幹空白字元。

c語言中d的作用是什麼,C語言/ C++中宏定義是什麼?有什麼作用呢?

使用宏進行條件編譯的用法與使用宏防止多重引用類似。示例如下:

#ifdef _DEBUG

//如果定義了_DEBUG,則執行#ifdef _DEBUG與#else之間的指令;

cout<

#else

//否則,執行#else與#endif之間的指令。

cout<

#endif

使用條件編譯,友善程式員在調試程式的過程中,執行一些在程式釋出後并不需要執行的指令。隻要在需要調試的代碼前加上_DEBUG的定義,就可以在調試程式的過程中輸出調試資訊。這樣友善我們檢視程式在運作過程中有沒有出現錯誤,定位錯誤出現的地方。而在程式釋出之前,取消_DEBUG的定義就可以不再執行調試代碼。

推薦下我自己的C/C++學習群:231662552,不管你是小白還是大牛,小編我都挺歡迎,不定期分享幹貨,包括我自己整理的一份2018最新的C/C++資料和零基礎入門教程,歡迎初學和進階中的小夥伴。

c語言中d的作用是什麼,C語言/ C++中宏定義是什麼?有什麼作用呢?

2、宏函數

函數的調用是需要一定的時間和空間代價的。因為系統在調用函數時,需要保留"現場",即将程式要執行的指令的下一條指令的位置壓入棧,然後轉入調用函數去執行,調用完函數後再傳回主調函數,恢複"現場",傳回到棧裡儲存的的下一條指令的位置繼續執行。是以函數的調用需要額外的時間和空間代價。

而宏函數則不存在上述問題,宏函數在預編譯時,同函數定義的代碼來替換函數名,将函數代碼段嵌入到目前程式,不會産生函數調用,是以會省去普通函數保留現場恢複現場的時間,但因為要将定義的函數體嵌入到目前程式,是以不可避免的會占用額外的存儲空間。在頻繁調用同一個宏的時候,該現象尤其明顯。

宏函數的示例定義如下:

#define MAX(a,b) ((a)

宏函數的優點在于避免函數調用,提高程式效率。

同時需要注意的是inline辨別符。inline也将函數定義為内聯的。但是使用内聯函數需要注意的是:函數體必須十分簡單,不能含有循環、條件、選擇等複雜結構,否則就不能作為内聯函數了。事實上,有時候即便你沒有将函數指定為内聯函數,編譯器也會将一些簡單的函數作為内聯函數處理,而對于一些複雜的函數,即使聲明為内聯函數,編譯器也不會理會的。inline函數的瓶頸就在于此,使用inline辨別符将函數聲明為内聯的,但這隻是一種提示,到底編譯器有沒有優化還依賴于編譯器的實作,而使用宏函數則完全由代碼本身控制。但在使用宏函數的時候,需要明确的是宏函數隻是簡單的替換,需要注意括号的使用。

c語言中d的作用是什麼,C語言/ C++中宏定義是什麼?有什麼作用呢?

說明:

(1)宏名一般用大寫

(2)使用宏可提高程式的通用性和易讀性,減少不一緻性,減少輸入錯誤和便于修改。例如:數組大小常用宏定義

(3)預處理是在編譯之前的處理,而編譯工作的任務之一就是文法檢查,預處理不做文法檢查。

(4)宏定義末尾不加分号;

(5)宏定義寫在函數的花括号外邊,作用域為其後的程式,通常在檔案的最開頭。

(6)可以用#undef指令終止宏定義的作用域

(7)宏定義不可以嵌套

(8)字元串" "中永遠不包含宏

(9)宏定義不配置設定記憶體,變量定義配置設定記憶體。

(10)宏定義不存在類型問題,它的參數也是無類型的。