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 預處理是在編譯之前的處理,而編譯工作的任務之一就是語法檢查,預處理不做...