bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

c語言函數傳遞宏,c語言宏定義函數

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

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

成都創新互聯是一家以網站建設、網頁設計、品牌設計、軟件運維、成都網站推廣、小程序App開發等移動開發為一體互聯網公司。已累計為成都雨棚定制等眾行業中小客戶提供優質的互聯網建站和軟件開發服務。

1、條件編譯:

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

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

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

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

這樣方便查看程序在運行過程中有沒有出現錯誤,定位錯誤出現的地方。而在程序發布之前,取消_DEBUG的定義就可以不再執行調試代碼。

2、宏函數:

函數的調用是需要一定的時間和空間代價的。因為系統在調用函數時,需要保留"現場",即將程序要執行的指令的下一條指令的位置壓入棧,然后轉入調用函數去執行,調用完函數后再返回主調函數,恢復"現場",返回到棧里保存的的下一條指令的位置繼續執行。

所以函數的調用需要額外的時間和空間代價。

而宏函數則不存在上述問題,宏函數在預編譯時,同函數定義的代碼來替換函數名,將函數代碼段嵌入到當前程序,不會產生函數調用。

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

在頻繁調用同一個宏的時候,該現象尤其明顯。宏函數的示例定義如下:

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

宏函數的優點在于避免函數調用,提高程序效率。

同時需要注意的是inline標識符。inline也將函數定義為內聯的。但是使用內聯函數需要注意的是:函數體必須十分簡單,不能含有循環、條件、選擇等復雜結構,否則就不能作為內聯函數了。

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

inline函數的瓶頸就在于此,使用inline標識符將函數聲明為內聯的,但這只是一種提示,到底編譯器有沒有優化還依賴于編譯器的實現,而使用宏函數則完全由代碼本身控制。

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

擴展資料:

宏的更多規則特性:

(1)宏名一般用大寫。

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

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

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

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

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

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

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

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

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

參考資料:

百度百科--宏定義

C語言在函數內定義宏有什么壞處嗎?

宏定義寫在函數內部主要是為了方便,宏定義是預處理的,并沒什么壞處

C語言中的宏定義如何傳遞形參

給宏傳遞運行時計算的變量是絕無可能辦到的。

不過假如只是這一個循環的話,可以利用預處理展開……

#define?REPEAT_0(f)??f(0)

#define?REPEAT_1(f)??REPEAT_0(f)?f(1)

#define?REPEAT_2(f)??REPEAT_1(f)?f(2)

#define?REPEAT_3(f)??REPEAT_2(f)?f(3)

#define?REPEAT_4(f)??REPEAT_3(f)?f(4)

#define?REPEAT_5(f)??REPEAT_4(f)?f(5)

#define?REPEAT_6(f)??REPEAT_5(f)?f(6)

#define?REPEAT_7(f)??REPEAT_6(f)?f(7)

#define?REPEAT_8(f)??ERROR_EXCEED_LIMIT

#define?REPEAT(n,f)??REPEAT_##n(f)

/*?用法如下?*/

#define?LD(n)?LEFT_BACK(n);Delay(4);

REPEAT(7,LD)

好處是這個宏是可以重用的,在別的地方也可以使用,并且不占運行時間。

c語言宏定義函數如何調用?

直接調用即可。如下示例:

#includestdio.h#define sum(b,c){int d=0;d=b+c;printf("兩者的和:%d\n",d);}int main(){ int x=0,y=0; scanf("%d%d",x,y); sum (x,y); return 0;}使用宏函數或者宏函數時,注意如下幾點:

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

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

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

(3)宏函數往往會導致較低的代碼執行效率。

 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)被調用了兩遍,這樣依此遞歸下去,時間復雜度會很高。

C語言-函數式宏

函數式宏(function-like macro)較之對象式宏可以進行更復雜的代換。

函數式宏 sqr 是在編譯時展開并填入程序的,因此 只要是能用雙目運算符 * 進行乘法計算的數據類型,都能使用函數式宏 。

函數定義則需為每個形參都定義各自的數據類型,返回值的類型也只能為一種。就這點而言,函數較為嚴格。

函數為我們默默無聞地進行了一些復雜處理,如:

而函數式宏所做的工作只是宏展開和填入程序,并不進行上述處理。

根據以上特征, 函數式宏或許能使程序的運行速度稍微提高一點,但是程序自身卻有可能變得臃腫 。

函數式宏在使用上必須小心謹慎。例如, sqr(a++) 展開后 ((a++) * (a++)) 。每次展開, a 的值都會自增兩次。在不經意間表達式被執行了兩次,導致程序出現預料之外的結果,我們稱這種情況為宏的 副作用(side effect) 。

名稱欄目:c語言函數傳遞宏,c語言宏定義函數
轉載源于:http://vcdvsql.cn/article44/hspeee.html

成都網站建設公司_創新互聯,為您提供動態網站全網營銷推廣定制開發微信公眾號服務器托管外貿網站建設

廣告

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

網站托管運營