19 巨集定義使用分析

2021-09-24 17:38:08 字數 2561 閱讀 9804

巨集開始給我的兩個印象:1、可以用來定義常量 2、定義**塊

1、c語言中的巨集定義

— #define 是預處理器處理的單元實體之一

— #define 定義的巨集可以出現在程式的任意位置

— #define 定義之後的**都可以使用這個巨集

2、定義巨集常量

— #define 定義的巨集常量可以直接使用

— #define 定義的巨集常量本質為字面量

#include #define erroe -1

#define path1 "d:\test\test.c"

#define path2 d:\test\test.c

#define path3 d:\test\

test.c

int main()

這個程式巨集定義是正確的,但是編譯過不了,不符合**的規範。

3、巨集定義表示式

— #define 表示式的使用類似於函式呼叫

— #define 表示式可以比函式更強大

— #define 表示式比函式更容易出錯

這個程式體現出了巨集的弊端,巨集是被預處理器定義的,直接進行文字替換,得到的結果和我們的預期結果發生誤差。

4、巨集表示式和函式進行對比

— 巨集表示式被預處理器處理,編譯器不知道巨集表示式的存在,函式是被編譯器處理,完全沒有可比性

— 巨集表示式用「實參」完全替代形參,是一種文字替換,不進行任何運算

— 優勢:巨集表示式沒有任何的「呼叫」開銷,函式需要引數的入棧和出棧,都是呼叫開銷

巨集表示式中不能出現遞迴定義

#include //#define _sum_(n) ((n > 0) ? (_sum_(n - 1) + n):0)		//error

int _sum_(int n)

int main()

根據這個程式我們知道所以巨集定義不能代替遞迴,畢竟就單純乙個文字替換,怎麼可能一直進行遞迴,所以遞迴最好還是用函式。

4、提出問題:巨集定義的常量或者表示式是否有作用域限制?

這個程式沒有報錯並且執行成功,因此我們可以得出結論,對於巨集而言,是沒有作用域的限制,當我們定義完巨集,後面的**就可以直接使用。作用域的概念是針對c語言裡面的變數和函式,不針對巨集,因為巨集是被預處理器處理的,我們的編譯器根本不知道巨集的存在,所以編譯器無法將作用域的概念應用於識別符號。

5、強大的內建巨集

這個程式主要是用內建巨集和基本的一些巨集定義來寫的,巨集的優點在於效率高。

巨集定義與使用分析

巨集定義常量 define巨集定義常量可以出現在 的任何地方 define從本行開始,之後的 都可以使用這個巨集常量 以上巨集定義都正確 最後乙個巨集定義採用了接續符 等同於 define path 3 d delphi ctopic3.ppt 巨集定義表示式 define表示式有函式呼叫的假象,卻...

巨集定義及使用分析

巨集定義及使用分析 1 巨集定義理解 1 表達形式 define 標示符 字串 2 巨集定義是用巨集名來表示乙個字串,是一種簡單的代換,字串中可以 含任何字元,可以是常數,也可以是表示式,預處理時不作任何檢查,編譯時才能查出錯誤。3 巨集定義不是說明或語句,在行末不需要加分號 4 巨集定義必須寫在函...

offsetof巨集定義分析

type是結構體型別,member是結構體中的乙個元素的元素名 define offsetof type,member int type 0 member 拆分為以下三個個步驟 1 type 0 將type型別結構體變數的首位址變為0 個人理解將其跟陣列比較 不一定正確 把0位址強制型別轉換成乙個指...