巨集開始給我的兩個印象: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位址強制型別轉換成乙個指...