知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
6-3 宏定義
發(fā)表時間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):64
6.3.1 宏定義的規(guī)則和使用解析
(1)宏定義的解析規(guī)則就是:在預處理階段由預處理器來進行替換,這個替換是原封不動的替換。
(2)宏定義替換會遞歸進行,直到替換出來的值本身不再是一個宏為止。
(3)一個正確的宏定義式子本身分為3部分:第一部分是#define,第二部分是宏名,剩下的為第三部分。
(4)宏可以帶參數(shù),稱為帶參宏。帶參宏的使用和帶參函數(shù)非常像,但是使用上有一些差異。在定義帶參宏時,每一個參數(shù)在宏體中引用時都必須加括號,最后整體再加括號,括號缺一不可。
#include <stdio.h>
#define X(a,b) ((a)+(b))
int main()
{
int a = 1,b = 2;
int c =3 * X(a,b);
printf("c = %d\n",c);
return 0;
}
6.3.2 宏定義示例1:MAX,求2個數(shù)中較大的一個
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
關鍵:
第一點:要想到使用三目運算符來完成。
第二點:注意括號的使用。
6.3.3 宏定義示例2:SEC_PER_YEAR,用宏定義表示一年有多少秒
#define SEC_PER_YEAR (365*24*60*60UL)
關鍵:
第一點:當一個數(shù)字直接出現(xiàn)在程序中時,它的類型默認是int;
第二點:一年有多少秒,這個數(shù)字剛好超過了int類型存儲的范圍
6.3.4 帶參宏和帶參函數(shù)的區(qū)別(宏定義的缺陷)
(1)宏定義是在預處理期間處理的,而函數(shù)是在編譯期間處理的。這個區(qū)別帶來的實質(zhì)差異是:宏定義最終是在調(diào)用宏的地方把宏體原地展開,而函數(shù)是在調(diào)用函數(shù)處跳轉(zhuǎn)到函數(shù)中去執(zhí)行,執(zhí)行完后再跳轉(zhuǎn)回來。
注意:宏定義和函數(shù)的最大差別就是:宏定義是原地展開,因此沒有調(diào)用開銷;而函數(shù)是跳轉(zhuǎn)執(zhí)行再返回,因此函數(shù)有比較大的調(diào)用開銷。所以宏定義和函數(shù)相比,優(yōu)勢就是沒有調(diào)用開銷,沒有傳參開銷,所以當函數(shù)體很短(尤其是只有一句話時)可以用宏定義來替代,這樣效率比較高。
(2)帶參宏和帶參函數(shù)的一個重要差別就是:宏定義不會檢查參數(shù)的類型,返回值也不會附帶類型;而函數(shù)有明確的參數(shù)類型和返回值類型。當我們調(diào)用函數(shù)時編譯器會幫我們做參數(shù)的靜態(tài)類型檢查,如果編譯器發(fā)現(xiàn)我們實際傳參和參數(shù)聲明不同時會報警告或錯誤。
注意:用函數(shù)的時候程序員不太用操心類型不匹配,因為編譯器會檢查,如果不匹配編譯器會叫;用宏的時候程序員必須很注意實際傳參和宏所希望的參數(shù)類型一致,否則可能編譯不報錯但是運行有誤。
總結(jié):宏和函數(shù)各有千秋,各有優(yōu)劣??偟膩碚f,如果代碼比較多用函數(shù)適合而且不影響效率;但是對于那些只有一兩句話的函數(shù)開銷就太大了,適合用帶參宏。但是用帶參宏又有缺點:不檢查參數(shù)類型。
6.3.5 內(nèi)聯(lián)函數(shù)和inline關鍵字
(1)內(nèi)聯(lián)函數(shù)通過在函數(shù)定義前加inline關鍵字實現(xiàn)。
(2)內(nèi)聯(lián)函數(shù)本質(zhì)上是函數(shù),所以有函數(shù)的優(yōu)點(內(nèi)聯(lián)函數(shù)是編譯器負責處理的,編譯器可以幫我們做參數(shù)的靜態(tài)類型檢查);但是它同時也有帶參宏的優(yōu)點(不用調(diào)用開銷,而是原地展開)。所以幾乎可以這樣認為:內(nèi)聯(lián)函數(shù)就是帶了參數(shù)靜態(tài)類型檢查的宏。
(3)當我們的函數(shù)內(nèi)函數(shù)體很短(譬如只有一兩句話)的時候,我們又希望利用編譯器的參數(shù)類型檢查來排錯,我還希望沒有調(diào)用開銷時,最適合用內(nèi)聯(lián)函數(shù)。
6.3.6 宏定義來實現(xiàn)條件編譯(#define #undef #ifdef)
(1)程序有DEBUG和RELEASE版本,區(qū)別就是編譯時有無定義DEBUG宏。
#include <stdio.h>
//這兩行代碼的效果加在一起就相當于沒有定義DEBUG
//注銷一個宏。如果前面有定義這個宏則取消這個宏,如果沒有就無視掉
#define DEBUG
#undef DEBUG
#ifdef DEBUG
#define debug(x) printf(x)
#else
#define debug(x)
#endif
int main(void)
{
debug("this is a debug info\n");
return 0;
}
相關案例查看更多
相關閱讀
- 網(wǎng)絡公司電話
- 做網(wǎng)站
- 云南網(wǎng)站建設公司哪家好
- 重慶網(wǎng)站建設公司
- 云南網(wǎng)站建設專業(yè)品牌
- uniapp開發(fā)小程序
- 紅河小程序開發(fā)
- 云南網(wǎng)絡營銷
- 網(wǎng)站建設選
- 網(wǎng)頁制作
- 網(wǎng)站建設特性
- 報廢車
- 網(wǎng)站維護
- 昆明小程序代建
- 汽車拆解管理軟件
- 云南小程序開發(fā)推薦
- 云南微信小程序開發(fā)
- 云南軟件定制
- 汽車報廢管理
- 云南網(wǎng)絡營銷顧問
- 云南小程序開發(fā)課程
- 微分銷
- 云南網(wǎng)站建設公司
- 云南網(wǎng)站建設招商
- 小程序
- 云南省建設廳官方網(wǎng)站
- 花農(nóng)小程序
- 分銷系統(tǒng)
- 云南省住房建設廳網(wǎng)站
- 企業(yè)網(wǎng)站