亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

函數式宏定義與普通函數的區別

2020-01-26 15:47:30
字體:
來源:轉載
供稿:網友

在C及C++語言中允許用一個標識符來表示一個字符串,稱為宏,該字符串可以是常數、表達式、格式串等。在編譯預處理時,對程序中所有出現的“宏名”,都用宏定義中的字符串去代換,這稱為“宏代換”或“宏展開”。宏定義是由源程序中的宏定義命令完成的。宏代換是由預處理程序自動完成的。若字符串是表達式,我們稱之為函數式宏定義,那函數式宏定義與普通函數有什么區別呢?

我們以下面兩行代碼為例,展開描述:
函數式宏定義:#define MAX(a,b) ((a)>(b)?(a):(b))
普通函數 :MAX(a,b) { return a>b?a:b;}

(1)函數式宏定義的參數沒有類型,預處理器只負責做形式上的替換,而不做參數類型檢查,所以傳參時要格外小心。

(2)調用真正函數的代碼和調用函數式宏定義的代碼編譯生成的指令不同。

如果MAX是個普通函數,那么它的函數體return a > b ? a : b; 要編譯生成指令,代碼中出現的每次調用也要編譯生成傳參指令和call指令。而如果MAX是個函數式宏定義,這個宏定義本身倒不必編譯生成指令,但是代碼中出現的每次調用編譯生成的指令都相當于一個函數體,而不是簡單的幾條傳參指令和call指令。所以,使用函數式宏定義編譯生成的目標文件會比較大。

(3)函數式宏定義要注意格式,尤其是括號。

如果上面的函數式宏定義寫成 #define MAX(a, b) (a>b?a:b),省去內層括號,則宏展開就成了k = (i&0x0f>j&0x0f?i&0x0f:j&0x0f),運算的優先級就錯了。同樣道理,這個宏定義的外層括號也是不能省的。若函數中是宏替換為 ++MAX(a,b),則宏展開就成了 ++(a)>(b)?(a):(b),運算優先級也是錯了。

(4)若函數參數為表達式,則普通函數的調用與函數式宏定義的替換過程是不一樣的。

普通函數調用時先求實參表達式的值再傳給形參,如果實參表達式有Side Effect,那么這些SideEffect只發生一次。例如MAX(++a, ++b),如果MAX是普通函數,a和b只增加一次。但如果MAX函數式宏定義,則要展開成k = ((++a)>(++b)?(++a):(++b)),a和b就不一定是增加一次還是兩次了。所以若參數是表達式,替換函數式宏定義時一定要仔細看好。

(5)函數式宏定義往往會導致較低的代碼執行效率。

看下面一段代碼:

復制代碼 代碼如下:

int a[]={9,3,5,2,1,0,8,7,6,4};
int max(n)
{
    return n==0?a[0]:MAX(a[n],max(n-1));
}

int main()
{
    max(9);
    return 0;
}


若是普通函數,則通過遞歸,可取的最大值,時間復雜度為O(n)。但若是函數式宏定義,則宏展開為( a[n]>max(n-1)?a[n]:max(n-1) ),其中max(n-1)被調用了兩遍,這樣依此遞歸下去,時間復雜度會很高。

盡管函數式宏定義和普通函數相比有很多缺點,但只要小心使用還是會顯著提高代碼的執行效率,畢竟省去了分配和釋放棧幀、傳參、傳返回值等一系列工作,因此那些簡短并且被頻繁調用的函數經常用函數式宏定義來代替實現。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美高清在线视频| 中文字幕一区二区三区电影| 91网在线免费观看| 久久精品视频在线播放| 欧美亚洲成人免费| 日韩av色综合| 国产精品久久久久久亚洲影视| 日韩电视剧免费观看网站| 亚洲免费小视频| 日本精品视频在线播放| 热久久这里只有| 国模私拍视频一区| 久久精品国产电影| 亚洲三级av在线| 欧美黑人狂野猛交老妇| 欧美猛交免费看| 这里精品视频免费| 日韩中文字幕网| 亚洲成avwww人| 欧美激情一区二区三区在线视频观看| 国外成人免费在线播放| 亚洲xxxx在线| 欧美一区二区影院| 亚洲热线99精品视频| 尤物九九久久国产精品的特点| 国内外成人免费激情在线视频网站| 日韩福利伦理影院免费| 国产精品观看在线亚洲人成网| 欧美制服第一页| 国产丝袜一区视频在线观看| 成人午夜小视频| 97香蕉久久夜色精品国产| 青青草一区二区| 国产一区二区久久精品| 成人午夜一级二级三级| 欧美激情视频一区二区| 国产精品午夜国产小视频| 欧美日韩午夜视频在线观看| 亚洲bt天天射| 有码中文亚洲精品| 久久综合九色九九| 国产精品日韩在线播放| 久久精品国产亚洲一区二区| 中文字幕欧美亚洲| 26uuu亚洲伊人春色| 久久综合伊人77777尤物| 欧美极品少妇全裸体| 中日韩美女免费视频网址在线观看| 日韩中文字幕视频| 伊人成人开心激情综合网| 91精品国产综合久久久久久久久| 欧美激情欧美激情| 97久久精品人人澡人人爽缅北| 欧美影院久久久| 美女视频黄免费的亚洲男人天堂| 国产成人久久久精品一区| 亚洲国产另类 国产精品国产免费| 国产成人高清激情视频在线观看| 亚洲国产美女久久久久| 97人人模人人爽人人喊中文字| 欧美在线视频一区二区| 日韩免费在线看| 久久在精品线影院精品国产| 成人在线播放av| 欧美成人一区二区三区电影| 欧美黄色片免费观看| 亚洲国产中文字幕在线观看| 久久精品视频亚洲| 欧美一级在线亚洲天堂| 国产不卡视频在线| 亚洲欧美色图片| 日韩极品精品视频免费观看| 狠狠做深爱婷婷久久综合一区| 成人久久一区二区三区| 日本久久久a级免费| 精品日韩美女的视频高清| 国精产品一区一区三区有限在线| 中文字幕精品久久久久| 国产成人精品电影久久久| 亚洲第一福利在线观看| 永久免费看mv网站入口亚洲| 久久久久久久久久久91| 欧美性色xo影院| 亚洲精品一区中文字幕乱码| 亚洲一品av免费观看| 青草青草久热精品视频在线网站| 91在线免费视频| 欧美一级在线播放| 日韩精品在线第一页| 亚洲男人第一av网站| 亚洲成人在线视频播放| 国产精品久久久久久久7电影| 97久久精品人搡人人玩| 久久九九国产精品怡红院| 国产女同一区二区| 亚洲精品福利资源站| 亚洲国模精品私拍| 欧美高清在线播放| 久久精品久久久久久国产 免费| 97久久伊人激情网| 91亚洲一区精品| 日韩电影中文 亚洲精品乱码| 久久综合五月天| 国外成人性视频| 欧美性资源免费| 亚洲精品中文字幕有码专区| 精品偷拍各种wc美女嘘嘘| 中文字幕日韩欧美在线| 91视频8mav| 亚洲成人999| 日韩视频―中文字幕| 日韩国产在线看| 国产v综合ⅴ日韩v欧美大片| 午夜免费久久久久| 成人午夜两性视频| 色噜噜国产精品视频一区二区| 精品亚洲精品福利线在观看| 精品久久久久久亚洲国产300| 欧美自拍大量在线观看| yellow中文字幕久久| 亚洲视频在线播放| 精品一区二区三区电影| 欧美性视频网站| 欧美在线免费视频| 亚洲综合日韩中文字幕v在线| 欧美极品在线播放| 亚洲第一网站免费视频| 日韩中文字幕av| 成人美女免费网站视频| 中文字幕久久久| 国产精品美女久久久久久免费| 日本精品久久中文字幕佐佐木| 欧美乱大交做爰xxxⅹ性3| 精品久久久久久久大神国产| 国产网站欧美日韩免费精品在线观看| 国产精品青青在线观看爽香蕉| 中文字幕亚洲在线| 亚洲视频在线观看免费| 日韩视频―中文字幕| 国产丝袜精品视频| 国产精品久久久| 亚洲国产精品小视频| 国产精品白嫩初高中害羞小美女| 精品国产欧美成人夜夜嗨| 欧美高清性猛交| 精品精品国产国产自在线| 91精品久久久久久久久| 国产欧亚日韩视频| 精品国产91乱高清在线观看| 日韩一区二区av| 久久人人爽人人爽人人片亚洲| 成人www视频在线观看| 97在线视频精品| 91久久精品美女| 菠萝蜜影院一区二区免费| 国产成人综合亚洲| 精品久久久久久中文字幕大豆网| 亚洲a中文字幕| 欧美极度另类性三渗透| 2024亚洲男人天堂| 日韩av片免费在线观看| 久久全国免费视频| 国产精品美女av| 精品福利一区二区|