天天看點

引用另一模闆的宏_函數模闆及宏定義簡單聊函數模闆函數模闆的定義函數模闆的聲明模闆函數函數模闆的作用宏定義宏定義中的#的用法宏定義中的##的用法宏定義中# 和## 的用法

引用另一模闆的宏_函數模闆及宏定義簡單聊函數模闆函數模闆的定義函數模闆的聲明模闆函數函數模闆的作用宏定義宏定義中的#的用法宏定義中的##的用法宏定義中# 和## 的用法

函數模闆

函數模闆不是一個具體的函數,編譯器不能為其生成可執行代碼。定義函數模闆後隻是一個對函數功能架構的描述,當他具體執行時,将根據傳遞的實際參數決定其功能。

函數模闆的定義

template  //template 關鍵字 定義模闆傳回類型 函數名 (形式參數表){... //函數體}
           

注:

  • <> : 表示模闆參數(模闆類型參數【class /typedef + 自定義合法辨別符】和模闆非類型參數【通常為一個常數】)
引用另一模闆的宏_函數模闆及宏定義簡單聊函數模闆函數模闆的定義函數模闆的聲明模闆函數函數模闆的作用宏定義宏定義中的#的用法宏定義中的##的用法宏定義中# 和## 的用法

函數模闆的聲明

可分兩部分:template部分和函數名部分

template  //T 表示泛型類型void func(T t) { ... //函數實作 (函數體)}
           

定義求和函數模闆

template  //定義模闆類型 type Sum(type x ,type y) //定義函數模闆{return x+y ;}int ir= Sum(5,10); //調用函數模闆,實作整數相加double dr =Sum(5.5,10.5) ; //調用函數模闆 ,實作實數相加//int/double ir =Sum(5.5 , 10 ) ; //錯誤:編譯器産生歧義,類型必須統一int ir = Sum(5.5,10);//顯示辨別模闆類型,避免歧義。
           
引用另一模闆的宏_函數模闆及宏定義簡單聊函數模闆函數模闆的定義函數模闆的聲明模闆函數函數模闆的作用宏定義宏定義中的#的用法宏定義中的##的用法宏定義中# 和## 的用法

模闆函數

即用函數模闆生成實際可執行的函數。

差別:

  • 函數模闆是一個“架構”,他不是真正可以編譯生成代碼的程式。
  • 模闆函數是把函數模闆中的類型參數執行個體化後生成的函數,它和普通函數本質是相同的,可以生成可執行的代碼。

函數模闆的作用

函數模闆代替普通函數實作抽象操作,減少重複勞動和維護、調試開銷。

引用另一模闆的宏_函數模闆及宏定義簡單聊函數模闆函數模闆的定義函數模闆的聲明模闆函數函數模闆的作用宏定義宏定義中的#的用法宏定義中的##的用法宏定義中# 和## 的用法

宏定義

了解:

宏定義又稱宏替換,簡稱“宏”。宏定義是指在 程式中出現一個宏定義的宏名時,在該程式編譯之前,先将宏名用被定義的字元串替換,之後才能進行編譯。此替換過程稱為宏定義。

辨別符:

#define

簡單宏定義:
#define  //例如: #define PI 3.141592653 // 把程式中出現的PI全部換成3.141592653 然後編譯#define AUTHOR "JianYunFeng" //“”内的内容不會被替換,且字元串雙引号必須完整 --注1。#define 0X 12ab //錯誤 ,宏名必須為合法的使用者辨別符(可為關鍵字)--注2
           

注:

  1. 宏名一般用大寫
  2. 宏定義末尾不加分号
  3. 宏定義寫在函數的外面,作用域為其後的程式,通常在檔案的開頭。
  4. 可以用#undef指令終止宏定義的作用域。
  5. 宏定義可以嵌套。
  6. 字元串“”中不能嵌套宏定義
引用另一模闆的宏_函數模闆及宏定義簡單聊函數模闆函數模闆的定義函數模闆的聲明模闆函數函數模闆的作用宏定義宏定義中的#的用法宏定義中的##的用法宏定義中# 和## 的用法

CPP編譯過程

帶參宏定義:
#define  () (宏體)//例如:#define J(x,y,z) ((x)^(x)+(y)^(y)+(z)^(z))
           

注:

  1. 宏名和參數的括号間不能有空格
  2. 宏定義隻做替換,不做計算及求解
  3. 宏的替換過程不存在類型,也沒有類型轉換。
優點:
  1. 使用宏可提高程式的通用性和易讀性,減少不一緻性,減少輸入錯誤和便于修改
  2. 宏定義不配置設定記憶體,但是變量定義配置設定記憶體,可以節省記憶體空間。
  3. 函數隻有一個傳回值,利用宏規則可以設法得到多個值
  4. 宏展開不占用運作時間,隻占用編譯時間,函數調用占用運作時間(包括配置設定記憶體、保留現場、值傳遞、傳回值)
缺點:
  • 宏展開是源程式變長,函數調用不會。
引用另一模闆的宏_函數模闆及宏定義簡單聊函數模闆函數模闆的定義函數模闆的聲明模闆函數函數模闆的作用宏定義宏定義中的#的用法宏定義中的##的用法宏定義中# 和## 的用法

宏定義中的#的用法

作用:

#用于給參數添加雙引号“”。

文法:
#define STR (str) #str//例如:#define STR(ME#AUTHOR) me#author //添加 ----替換後--- "me#author“
           

注:

  1. #define STR( ) ) /STR( , ) 等 ,) 和 , 都不會被當做參數。
  2. 參數過多,編譯器會自動省去
引用另一模闆的宏_函數模闆及宏定義簡單聊函數模闆函數模闆的定義函數模闆的聲明模闆函數函數模闆的作用宏定義宏定義中的#的用法宏定義中的##的用法宏定義中# 和## 的用法

宏定義中的##的用法

作用:

##用于左邊加引用

文法:
#define STR(str) L##str // -- 翻譯過後--Lstr//例如:STR("I love U") ---結果: L"I love U"#define FUN(a,b) vo##a##b()// FUN(id ma ,in) --結果為: void main()
           

宏定義中# 和## 的用法

1.使用#把宏參數變為一個字元串,用##把兩個宏參數貼合在一起。

2.合并匿名變量

3.填充結構

4.記錄檔案名

5.得到一個數值類型所對應的字元串緩沖大小

本文部分内容參考至網絡,如有錯誤,敬請指正,如有侵權,請聯系修改,如有疑問,歡迎提出讨論,謝謝。