宏調c語言,宏 C語言

本文目錄一覽:

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語言中的“宏”是指什麼?

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

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

A

b+c

宏定義出現在c語言的源代碼中,在正式編譯前,編譯器會進行預處理,而預處理過程包括一個很重要的任務(當然還有其它任務),就是替換宏,這種替換是一種機械的替換,並不考慮標識符的語法,語義,也就是說當遇到上面的A時,會直接替換成b+c。

還有一種更加靈活的宏,是帶參數的宏,例如:#define

F(a,b)

(a)+(b)

替換時會根據引入參數,這樣,F(1,2)會被替換成(1)+(2)。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/192205.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-01 09:56
下一篇 2024-12-01 09:56

相關推薦

  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28
  • Python基礎語言

    Python作為一種高級編程語言擁有簡潔優雅的語法。在本文中,我們將從多個方面探究Python基礎語言的特點以及使用技巧。 一、數據類型 Python基礎數據類型包括整數、浮點數、…

    編程 2025-04-28

發表回復

登錄後才能評論