什麼是巨集定義,在C語言中 巨集定義是什麼?

2021-03-22 02:50:57 字數 6102 閱讀 3976

1樓:薔祀

巨集定義是高階語言編譯器提供的常用語法,其目的是利用某一識別符號標識某個文字字串。在編寫程式時,如果程式中反覆地使用某個資料或某段程式片段,就可以考慮將這個資料或程式片段定義為巨集,然後每個出現該資料或程式片段的地方用巨集名替代

選擇巨集定義來做的好處是程式簡潔,可讀性好,而且當需要修改這些相同的程式片段時,只要修改巨集定義中的字串即可,不需要修改多處。

擴充套件資料

參巨集定義中#的用法:

#define str(str) #str

#用於把巨集定義中的引數兩端加上字串的""

比如,這裡str(my#name)會被替換成"my#name",一般由任意字元都可以做形參,但以下情況會出錯:

str())這樣,編譯器不會把")"當成str()的引數。str(,)同上,編譯器不會把","當成str的引數。str(a,b)如果實參過多,則編譯器會把多餘的引數捨去。

(vc++2008為例)str((a,b))會被解讀為實參為:(a,b),而不是被解讀為兩個實參,第一個是(a第二個是b)。

2樓:桑禮潮風

通俗的講就是對你常用的值或公式進行事先的定義編譯,以優化**吧~還是看下下面的列子,體會下吧~

表示式:

#define

識別符號字串

比如:#define

pi3.1415926

它的意思就是把3.1415926賦值給pi又比如:

#define

a(x,y)

x*y它的意思就是在主函式中若

x=2,y=3,則a(x,y)=6,

因為它巨集定義了a(x,y)=x*y。

記住,如果巨集定義了,它的值(在整個程式中)是不會變的,除非你對它再一次巨集定義,但這樣會降低程式的可讀性,所以儘量不要重複定義相同的內容。

3樓:忘我之魚

1.不帶引數的巨集定義:

巨集定義又稱為巨集代換、巨集替換,簡稱「巨集」。

格式:#define 識別符號

字串其中的識別符號就是所謂的符號常量,也稱為「巨集名」。

預處理(預編譯)工作也叫做巨集:將巨集名替換為字串。

掌握"巨集"概念的關鍵是「換」。一切以換為前提、做任何事情之前先要換,準確理解之前就要「換」。

即在對相關命令或語句的含義和功能作具體分析之前就要換:

例:#define pi 3.1415926

把程式中出現的pi全部換成3.1415926

說明:(1)巨集名一般用大寫

(2)使用巨集可提高程式的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如:陣列大小常用巨集定義

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

(4)巨集定義末尾不加分號;

(5)巨集定義寫在函式的花括號外邊,作用域為其後的程式,通常在檔案的最開頭。

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

(7)巨集定義可以巢狀

(8)字串" "中永遠不包含巨集

(9)巨集定義不分配記憶體,變數定義分配記憶體。

2.帶引數的巨集:

除了一般的字串替換,還要做引數代換

格式:#define 巨集名(參數列) 字串

例如:#define s(a,b) a*b

area=s(3,2);第一步被換為area=a*b; ,第二步被換為area=3*2;

類似於函式呼叫,有一個啞實結合的過程:

(1)實參如果是表示式容易出問題

#define s(r) r*r

area=s(a+b);第一步換為area=r*r;,第二步被換為area=a+b*a+b;

正確的巨集定義是#define s(r) (r)*(r)

(2)巨集名和引數的括號間不能有空格

(3)巨集替換隻作替換,不做計算,不做表示式求解

(4)函式呼叫在編譯後程式執行時進行,並且分配記憶體。巨集替換在編譯前進行,不分配記憶體

(5)巨集的啞實結合不存在型別,也沒有型別轉換。

(6)函式只有一個返回值,利用巨集則可以設法得到多個值

(7)巨集使源程式變長,函式呼叫不會

(8)巨集不佔執行時間,只佔編譯時間,函式呼叫佔執行時間(分配記憶體、保留現場、值傳遞、返回值)

4樓:盍清竹魏雀

一個程式由多個檔案組成,特別是有多個標頭檔案組成時一定要用巨集,目的是避免互相嵌入造成重複定義,給編譯器一個清晰的程式結構。

例如所有的mfc

vc++

的標頭檔案都有這個巨集

#if!defined(afx_....

#define

afx_....

...#endif

呼叫動態聯結庫要用巨集

#pragma....

定義替代字元要用巨集,例如

#define

shuzu_daxiao

2000

...float

a[shuzu_daxiao],b[shuzu_daxiao];

編譯前編譯器會用2000替代所有字元shuzu_daxiao。

如果是一般變數,就不能用巨集,例如:

inti,j,k;

void

main(int

n,char

*argv)

這是標準的c的主程式寫法。

用void

表示主程式執行終了沒有返回值送回作業系統。

如果是int

main(int

n,char

*argv)

主程式執行終了有返回值送回作業系統,主程式內要有return語句。

網上找的希望對你有幫助

5樓:壹陸南柒陸北

巨集定義,別名巨集代換,是c提供的三種預處理功能的其中一種,這三種預處理包括:巨集定義、檔案包含、條件編譯。

6樓:匿名使用者

c語言源程式中,一個字串可能在程式中多次出現。這時可以將該字串用一個特定的識別符號代替,這種表示方法,稱為巨集定義。它包括無參巨集定義和帶參巨集定義兩類。

7樓:匿名使用者

用#define 定義的替換巨集函式

在c語言中 巨集定義是什麼?

8樓:雪人晒太陽

在c語言源程式中,允許用一個識別符號來表示一個字串,稱為巨集,巨集定義是由源程式中的巨集定義命令完成的,巨集替換是由預處理程式自動完成的。巨集定義是c提供的三種預處理功能的其中一種,這三種預處理包括:巨集定義、檔案包含、條件編譯。

9樓:仁昌居士

c語言中的巨集定義用法分為兩種。

1、不帶引數的巨集定義比較簡單,就是用一個指定的識別符號來代表一個字串。它的一般形式為「#define 識別符號 字串」,例如#define e 2.718281828459。

這種方法使使用者能以一個簡單的名字代替一個長的字串。

2、帶引數的巨集定義不是僅僅進行簡單的字串替換,還要進行引數替換。其定義的一般形式為;「#define 識別符號(巨集名)(參數列) 字串」,字串中包含在括號中所指定的引數。例如#define s(a,b) a*b area=s(3.

2)。

c語言中什麼是巨集定義,它是幹什麼的?

10樓:蜻蜓點水

就是強制性的字元替換,比如說你要用a代表6,那麼後面所有是a的地方都是用字元6替換掉就可以了,這個是不進行運算只是替換

比如define a (a+b)

那麼後面所有a的地方都可以全部替換成(a+b)但是你不能用a+b的結果

11樓:

巨集定義又稱為預定義,它有很多功能,我也剛剛瞭解一點。首先他能定義常量,這樣我們可以集中統一修改。其次,它還能定義函式(預定義)。總之,熟悉它會很方便。

這些巨集定義是什麼意思

12樓:匿名使用者

巨集定義,相當於在後面程式中,所有遇到巨集定義的地方,直接用後面的式子替代。如

bm定義為 #define bm(n) (1 << (n))

在後面出現bm(n)的地方,就是直接用 (1 << (n))替換。

bm(1),直接就是執行把1左移一位。

1、val是一個引數,就是給埠賦值的變數引數。

2、^:按位「異或」——僅當兩個運算元不同時,相應的輸出結果才為1,否則為0。

st( p##port##_##pin## ^= 1; )表示對應的埠pin腳是1時,表示式結果為0,是0時,表示式結果為1。

預定義運算與函式中運算子的運算是一樣的,關鍵在於靈活掌握運算子的含義與使用。

3、表示dir的值與bm(pin)「相或」,結果賦值給dir;

4、表示dir的值與bm(pin)的按位求反的值「相與」,結果賦值給dir。

13樓:匿名使用者

##是連線符,即p##port##dir =pportdir。不是dir,而是pportdir,pportdir為cc2530方向控制暫存器port可由具體數字替代,,如要設定p1.1位輸出方式,即port=1,pin=1即可(根據無線點亮小燈具體函式)。

可參看cc2530 datasheet.

「c語言的巨集定義」是什麼?

14樓:留名在世射手

巨集定義又稱為巨集代換、巨集替換,簡稱「巨集」。

是c提供的三種預處理功能的其中一種。

1、巨集名一般用大寫。

2、使用巨集可提高程式的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如:陣列大小常用巨集定義。

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

4、巨集定義末尾不加分號。

5、巨集定義寫在函式的花括號外邊,作用域為其後的程式,通常在檔案的最開頭。

6、可以用#undef命令終止巨集定義的作用域。

7、巨集定義可以巢狀。

8、字串" "中永遠不包含巨集。

9、巨集定義不分配記憶體,變數定義分配記憶體。

15樓:漫承依月桃

定義一個字串來代表一個數字,或者一個表示式例如:#define

pi3.1415926

#define

s(x+y*z)

c語言中巨集定義是什麼意思?

16樓:

形式:#define《巨集標誌》《字串》

例如 #define pi 3.14159

表示在以下的程式中 pi 課代替3.14159

17樓:匿名使用者

就是給一些常用到的引數給一個值,在後面用到這個引數時就用這個巨集標誌代替舊可以了。舊比如樓上說的pi,每次都輸入3.1415926比較麻煩,巨集定義後就可以用pi代替3.

1415926了。

18樓:永恆求知者

說白了,就是文字處理,沒那麼複雜

19樓:業令酈雪峰

設定a=b+c,則在下面語句中所有的a都會被替換成b+c

20樓:騰昌休秋芸

##用來連線前後兩個引數,把它們變成一個字串,比如bdbg_object_id(abc)可解釋為extern

const

char

bdbg_id_unused_abc

21樓:逯昕修運晟

舉一個小例子:

#include

#define

pi3.1415926

intmain()

上面的這個

22樓:霜蘿越易雲

巨集定義 就這樣理解 程式後面所有的x 都被轉成你設定的值

在c語言學習中什麼叫巨集定義?

23樓:

巨集定義是高階語言編譯器提供的常用語法,其目的是利用某一識別符號標識某個文字字串。在編寫程式時,如果程式中反覆地使用某個資料或某段程式片段,就可以考慮將這個資料或程式片段定義為巨集,然後每個出現該資料或程式片段的地方用巨集名替代,這樣做的好處是程式簡潔,可讀性好,而且當需要修改這些相同的程式片段時,只要修改巨集定義中的字串即可,不需要修改多處。

c語言中define巨集定義和變數定義的聯絡和區別

巨集定義是全域性性的,變數定義是區域性性的,巨集定義主要在預處理階段完成,由前處理器進行字元替換,變數定義則會在記憶體中為變數分配地址。define巨集定義的量是做常量處理的,如 define price 30,下文只要遇到price就代表常量30,他與變數的區別之一是在書出語句中printf d ...

C語言中預處理檔案(define),巨集定義(define)兩個寫法一樣有什麼區別?一定採納

巨集定義是預處理的 預處理的不止是巨集定義。包括你包含的標頭檔案,預處理的定義在以後你學到編譯原理這門課的時候會解釋,他是編譯之前做的一件事情。總之,巨集定義跟預處理不是同一概念,只是巨集定義在編譯的過程中是預處理的。望採納!你寫的兩個不是一樣的嗎 沒有區別。一點區別都沒有 c語言中預處理檔案包含 ...

在c語言中巨集是什麼意思在C語言中巨集是什麼意思?

簡單來說 巨集定義又稱為巨集代換 巨集替換,簡稱 巨集 是c提供的三種預處理功能的其中一種。說明 1 巨集名一般用大寫 2 使用巨集可提高程式的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如 陣列大小常用巨集定義 3 預處理是在編譯之前的處理,而編譯工作的任務之一就是語法檢查,預處理不做...