欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

c語言宏函數(shù) c語言宏函數(shù)的使用方法

c語言宏實參函數(shù)展開問題

看你的敘述,你的宏應(yīng)該是想計算某個數(shù)的平方。在C語言中,宏的展開僅僅是“字符”替換。當(dāng)宏中有運(yùn)算操作時,要定義好宏的參數(shù)(用括號來括好參數(shù)),不然結(jié)果可能不是想要的。如定義一個計算某個數(shù)的平方的宏,如果如下寫法:

創(chuàng)新互聯(lián)長期為數(shù)千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為桐鄉(xiāng)企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)桐鄉(xiāng)網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

#define S(a)????a*a

這種寫法是錯誤的。如果這么使用 S(100),它的結(jié)果正確,展開為100*100;但如果這么使用 S(50+50),它的結(jié)果就是錯誤的,展開為 50+50*50+50。

正確的定義方式是:

#define S(a) ????((a)*(a))

下面在手機(jī)上用易歷知食軟件內(nèi)的微C程序設(shè)計來演示一下效果,直接在手機(jī)上編個小程序,手機(jī)上的代碼如下:

運(yùn)行結(jié)果如下(可見第1種定義是錯誤的,本來想要的是(1+2)的平方,結(jié)果卻為5,即1+2*1+2):

c語言關(guān)于宏定義、函數(shù)

宏定義的基礎(chǔ)知識。引用宏定義時,直接代入進(jìn)行代換。

既然已經(jīng)宏定義SUB(a) (a)-(a),而程序中出現(xiàn)的對應(yīng)a的是a+b,那么就將a換為a+b代入表達(dá)式:

d=SUB(a+b)*c=(a+b)-(a+b)*c=(2+3)-(2+3)*5

直接用(a+b)-(a+b)代換SUB(a+b)。這一點(diǎn)和數(shù)學(xué)是不同的,不要強(qiáng)行往數(shù)學(xué)上靠。

請問C語言中帶參數(shù)的宏和函數(shù)的比較

宏是用于編譯器處理的,他在程序編譯時,會在對應(yīng)位置展開成代碼。。,這就相當(dāng)于你在告訴編譯器,我想在這個位置加一些代碼,代碼的內(nèi)容已在宏中定義,請編譯器自己支找。。。,也就是說程序在運(yùn)行時,早已變成了對應(yīng)位置上的代碼,此時已沒有宏的概念了。。。。

而函數(shù)則是運(yùn)行時,調(diào)用。他不會在編譯時,在對應(yīng)位置上加上函數(shù)代碼,只是加上一個函數(shù)入口指針。。。從這個入口去運(yùn)行一段代碼。。。運(yùn)行完了之后回到當(dāng)前位置繼續(xù)執(zhí)行。。。。

可以簡單的認(rèn)為,宏是在編譯時上起作用,而函數(shù)是運(yùn)行時起作用。。。

c語言中的“宏”是指什么?

宏是一種預(yù)處理指令,它提供了一種機(jī)制,可以用來替換源代碼中的字符串。

1、條件編譯:

C語言中,預(yù)處理過程讀入源代碼,檢查包含預(yù)處理指令的語句和宏定義,并對源代碼進(jìn)行相應(yīng)的轉(zhuǎn)換,預(yù)處理過程還會刪除程序中的注釋和多余的空白符號。

預(yù)處理指令是以#開頭的代碼行,#必須是該行除了空白字符外的第一個字符。#后是指令關(guān)鍵字,在#和指令關(guān)鍵字之間允許存在若干空白字符。

使用宏進(jìn)行條件編譯的用法與使用宏防止多重引用類似。示例如下:

使用條件編譯,方便程序員在調(diào)試程序的過程中,執(zhí)行一些在程序發(fā)布后并不需要執(zhí)行的指令。只要在需要調(diào)試的代碼前加上_DEBUG的定義,就可以在調(diào)試程序的過程中輸出調(diào)試信息。

這樣方便查看程序在運(yùn)行過程中有沒有出現(xiàn)錯誤,定位錯誤出現(xiàn)的地方。而在程序發(fā)布之前,取消_DEBUG的定義就可以不再執(zhí)行調(diào)試代碼。

2、宏函數(shù):

函數(shù)的調(diào)用是需要一定的時間和空間代價的。因為系統(tǒng)在調(diào)用函數(shù)時,需要保留"現(xiàn)場",即將程序要執(zhí)行的指令的下一條指令的位置壓入棧,然后轉(zhuǎn)入調(diào)用函數(shù)去執(zhí)行,調(diào)用完函數(shù)后再返回主調(diào)函數(shù),恢復(fù)"現(xiàn)場",返回到棧里保存的的下一條指令的位置繼續(xù)執(zhí)行。

所以函數(shù)的調(diào)用需要額外的時間和空間代價。

而宏函數(shù)則不存在上述問題,宏函數(shù)在預(yù)編譯時,同函數(shù)定義的代碼來替換函數(shù)名,將函數(shù)代碼段嵌入到當(dāng)前程序,不會產(chǎn)生函數(shù)調(diào)用。

所以會省去普通函數(shù)保留現(xiàn)場恢復(fù)現(xiàn)場的時間,但因為要將定義的函數(shù)體嵌入到當(dāng)前程序,所以不可避免的會占用額外的存儲空間。

在頻繁調(diào)用同一個宏的時候,該現(xiàn)象尤其明顯。宏函數(shù)的示例定義如下:

#define MAX(a,b) ((a)(b)?(b):(a))

宏函數(shù)的優(yōu)點(diǎn)在于避免函數(shù)調(diào)用,提高程序效率。

同時需要注意的是inline標(biāo)識符。inline也將函數(shù)定義為內(nèi)聯(lián)的。但是使用內(nèi)聯(lián)函數(shù)需要注意的是:函數(shù)體必須十分簡單,不能含有循環(huán)、條件、選擇等復(fù)雜結(jié)構(gòu),否則就不能作為內(nèi)聯(lián)函數(shù)了。

事實上,有時候即便你沒有將函數(shù)指定為內(nèi)聯(lián)函數(shù),編譯器也會將一些簡單的函數(shù)作為內(nèi)聯(lián)函數(shù)處理,而對于一些復(fù)雜的函數(shù),即使聲明為內(nèi)聯(lián)函數(shù),編譯器也不會理會的。

inline函數(shù)的瓶頸就在于此,使用inline標(biāo)識符將函數(shù)聲明為內(nèi)聯(lián)的,但這只是一種提示,到底編譯器有沒有優(yōu)化還依賴于編譯器的實現(xiàn),而使用宏函數(shù)則完全由代碼本身控制。

但在使用宏函數(shù)的時候,需要明確的是宏函數(shù)只是簡單的替換,需要注意括號的使用。

擴(kuò)展資料:

宏的更多規(guī)則特性:

(1)宏名一般用大寫。

(2)使用宏可提高程序的通用性和易讀性,減少不一致性,減少輸入錯誤和便于修改。例如:數(shù)組大小常用宏定義。

(3)預(yù)處理是在編譯之前的處理,而編譯工作的任務(wù)之一就是語法檢查,預(yù)處理不做語法檢查。

(4)宏定義末尾不加分號。

(5)宏定義寫在函數(shù)的花括號外邊,作用域為其后的程序,通常在文件的最開頭。

(6)可以用#undef命令終止宏定義的作用域。

(7)宏定義不可以嵌套。

(8)字符串" "中永遠(yuǎn)不包含宏。

(9)宏定義不分配內(nèi)存,變量定義分配內(nèi)存。

(10)宏定義不存在類型問題,它的參數(shù)也是無類型的。

參考資料:

百度百科--宏定義

C語言中宏函數(shù)跟自定義的函數(shù)有什么區(qū)別?

可以把宏理解成拼字游戲,它功能很強(qiáng)大,但是強(qiáng)大到使用不好就會有副作用。C++有很多語言設(shè)施用來完全特定功能的宏,如const,inline,template,就是為了讓大家少用宏。給你舉個宏和函數(shù)不同的例子代碼:

#define max(x,y) ((x)(y)?(x):(y))

template class T

inline T max(T x,T y){return xy?x:y;}

看起來似乎是相同的功能,可是函數(shù)調(diào)用,畢竟會求完每一個實參的值,再傳遞給被調(diào)函數(shù),即使聲明了inline,在調(diào)用點(diǎn)展開而不發(fā)生實際的調(diào)用開銷。

但是你試試用這個調(diào)用宏,結(jié)果就會有問題:

int i=4,j=5;

int k=max(i++,j++);

如果是函數(shù)調(diào)用,i==5,j==6,k==5。如果是宏的話,結(jié)果是:

int k=((i++)(j++)?(i++):(j++));

你覺得會一樣嗎?所以,慎用宏。

MFC中有很多功能是宏完成的,它太強(qiáng)大了,很多情況下有宏很高效,但是不容易控制。

當(dāng)前文章:c語言宏函數(shù) c語言宏函數(shù)的使用方法
網(wǎng)站路徑:http://www.chinadenli.net/article40/doodpho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司微信小程序用戶體驗網(wǎng)站改版外貿(mào)網(wǎng)站建設(shè)靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司