『壹』 在c語言中 宏定義是什麼
在C語言源程序中,允許用一個標識符來表示一個字元串,稱為宏,宏定義是由源程序中的宏定義命令完成的,宏替換是由預處理程序自動完成的。宏定義是C提供的三種預處理功能的其中一種,這三種預處理包括:宏定義、文件包含、條件編譯。
(1)c語言中函數與宏定義擴展閱讀:
宏(Macro),是一種批量處理的稱謂。計算機科學里的宏是一種抽象,它根據一系列預定義的規則替換一定的文本模式。
計算機語言如C語言或匯編語言有簡單的宏系統,由編譯器或匯編器的預處理器實現。C語言的宏預處理器的工作只是簡單的文本搜索和替換,使用附加的文本處理語言如M4,C程序員可以獲得更精巧的宏。
『貳』 C語言中宏函數跟自定義的函數有什麼區別
可以把宏理解成拼字游戲,它功能很強大,但是強大到使用不好就會有副作用。C++有很多語言設施用來完全特定功能的宏,如const,inline,template,就是為了讓大家少用宏。給你舉個宏和函數不同的例子代碼:
#define max(x,y) ((x)>(y)?(x):(y))
template <class T>
inline T max(T x,T y){return x>y?x:y;}
看起來似乎是相同的功能,可是函數調用,畢竟會求完每一個實參的值,再傳遞給被調函數,即使聲明了inline,在調用點展開而不發生實際的調用開銷。
但是你試試用這個調用宏,結果就會有問題:
int i=4,j=5;
int k=max(i++,j++);
如果是函數調用,i==5,j==6,k==5。如果是宏的話,結果是:
int k=((i++)>(j++)?(i++):(j++));
你覺得會一樣嗎?所以,慎用宏。
MFC中有很多功能是宏完成的,它太強大了,很多情況下有宏很高效,但是不容易控制。
『叄』 「C語言的宏定義」是什麼
宏定義又稱為宏代換、宏替換,簡稱「宏」。
是C提供的三種預處理功能的其中一種。
『肆』 c語言宏定義函數如何調用
在軟體開發過程中,經常有一些常用或者通用的功能或者代碼段,這些功能既可以寫成函數,也可以封裝成為宏定義。那麼究竟是用函數好,還是宏定義好?這就要求我們對二者進行合理的取捨。
我們來看一個例子,比較兩個數或者表達式大小,首先我們把它寫成宏定義:
#define MAX( a, b) ( (a) > (b) (a) : (b) )
其次,把它用函數來實現:
int max( int a, int b)
{
return (a > b a : b)
}
很顯然,我們不會選擇用函數來完成這個任務,原因有兩個:首先,函數調用會帶來額外的開銷,它需要開辟一片棧空間,記錄返回地址,將形參壓棧,從函數返回還要釋放堆棧。這種開銷不僅會降低代碼效率,而且代碼量也會大大增加,而使用宏定義則在代碼規模和速度方面都比函數更勝一籌;其次,函數的參數必須被聲明為一種特定的類型,所以它只能在類型合適的表達式上使用,我們如果要比較兩個浮點型的大小,就不得不再寫一個專門針對浮點型的比較函數。反之,上面的那個宏定義可以用於整形、長整形、單浮點型、雙浮點型以及其他任何可以用「>」操作符比較值大小的類型,也就是說,宏是與類型無關的。
和使用函數相比,使用宏的不利之處在於每次使用宏時,一份宏定義代碼的拷貝都會插入到程序中。除非宏非常短,否則使用宏會大幅度增加程序的長度。
還有一些任務根本無法用函數實現,但是用宏定義卻很好實現。比如參數類型沒法作為參數傳遞給函數,但是可以把參數類型傳遞給帶參的宏。
看下面的例子:
#define MALLOC(n, type) \
( (type *) malloc((n)* sizeof(type)))
利用這個宏,我們就可以為任何類型分配一段我們指定的空間大小,並返回指向這段空間的指針。我們可以觀察一下這個宏確切的工作過程:
int *ptr;
ptr = MALLOC ( 5, int );
將這宏展開以後的結果:
ptr = (int *) malloc ( (5) * sizeof(int) );
這個例子是宏定義的經典應用之一,完成了函數不能完成的功能,但是宏定義也不能濫用,通常,如果相同的代碼需要出現在程序的幾個地方,更好的方法是把它實現為一個函數。
下面總結和宏和函數的不同之處,以供大家寫代碼時使用,這段總結摘自《C和指針》一書。
example:
define的單行定義
#define maxi(a,b) (a>;b?a:b)
define的多行定義
define可以替代多行的代碼,例如MFC中的宏定義(非常的經典,雖然讓人看了惡心)
#define MACRO(arg1, arg2) do { \
\
stmt1; \
stmt2; \
\
} while(0)
關鍵是要在每一個換行的時候加上一個 "\ "
//宏定義寫出swap(x,y)交換函數
#define swap(x, y)\
x = x + y;\
y = x - y;\
x = x - y;
zigbee里多行define有如下例子
#define FillAndSendTxOptions( TRANSSEQ, ADDR, ID, LEN, TxO ) { \
afStatus_t stat; \
ZDP_TxOptions = (TxO); \
stat = fillAndSend( (TRANSSEQ), (ADDR), (ID), (LEN) ); \
ZDP_TxOptions = AF_TX_OPTIONS_NONE; \
return stat; \
}
『伍』 C語言函數後跟一個宏定義是什麼意思
預處理運算符# #為宏擴展提供了一種連接實際變元的手段。如果替換文本中的參數用 # #相
連,那麼參數就被實際變元替換, # #與前後的空白符被刪除,並對替換後的結果重新掃描。例
如,下面定義的宏p a s t e用於連接兩個變元:
#define paste( front, back ) front ## back
從而宏調用paste(name, 1)的結果是建立單詞n a m e 1。
『陸』 c語言關於宏定義、函數
宏定義的基礎知識。引用宏定義時,直接代入進行代換。
既然已經宏定義SUB(a) (a)-(a),而程序中出現的對應a的是a+b,那麼就將a換為a+b代入表達式:
d=SUB(a+b)*c=(a+b)-(a+b)*c=(2+3)-(2+3)*5
直接用(a+b)-(a+b)代換SUB(a+b)。這一點和數學是不同的,不要強行往數學上靠。
『柒』 C語言中帶參數的宏定義與函數的區別(試舉例)
宏只是字元的替換,在預處理階段就給替換到代碼中去了比如下面的代碼
#include
#define
MAX(x,
y)
((x)>(y)?(x):y())
int
main()
{
int
a
=
2,
b
=
4;
int
m;
m
=
MAX(2,
4);
printf("%d\n",
m);
return
0;
}
如果你用的是gcc編譯器,執行
gcc
-E
main.c
-o
main.i,打開main.i文件就可以看到他是如何替換進去的,直接拖到最後,前面的都是stdio.h中的內容。
int
main()
{
int
a
=
2,
b
=
4;
int
m;
m
=
((2)>(4)?(2):4());
printf("%d\n",
m);
return
0;
}
函數就不同了,函數還需要分配棧空間,在執行函數時都要進行入棧和出棧操作,有的還需要分配堆空間。
宏所實現的功能有限,而且長代碼不易讀,但是對於邏輯簡單、代碼不長、經常使用的功能由宏來實現是個不錯的選擇
『捌』 c語言宏定義和函數的區別
不管是宏定義還是函數,都不要在修改某個變數之後,在同一個表達式中的另一個地方讀取這個變數的值。否則結果就是未定義的
對於你的代碼,在下面的表達式中
printf("%d^2=%d ",(i-1),SQ(i++))
//12
標有 2 的地方修改了變數 i 的值,標有 1 的地方又嘗試讀取 i 的值。你可能以為 1 在 2 之前計算。然而——你以為你以為的就是你以為的?
『玖』 c語言,宏定義,與函數的差別 我覺得宏定義和函數沒什麼差別啊, 是否可以用宏定義代替函數
首先宏定義和函數是有差別的
宏定義是在編譯之前處理的,不做語法檢查。
這個很危險
另外我要說
#define
a(b,c)
{(b)+(c)}
表示bc之合,在結果上和函數確實一樣