A. c語言中的宏定義怎麼用
C語言中的宏定義用法分為兩種。
1、不帶參數的宏定義比較簡單,就是用一個指定的標識符來代表一個字元串。它的一般形式為「#define 標識符 字元串」,例如#define E 2.718281828459。這種方法使用戶能以一個簡單的名字代替一個長的字元串。
2、帶參數的宏定義不是僅僅進行簡單的字元串替換,還要進行參數替換。其定義的一般形式為;「#define 標識符(宏名)(參數表) 字元串」,字元串中包含在括弧中所指定的參數。例如#define S(a,b) a*b area=S(3. 2)。
(1)c語言宏定義函數調用擴展閱讀:
宏定義只佔編譯時間,函數調用則佔用運行時間(分配單元,保存現場,值傳遞,返回),每次執行都要載入,所以執行相對宏定義會較慢。
使用宏定義次數多時,宏定義展開後源程序很長,因為每展開一次都使程序增長,但是執行起來比較快一點(這也不是絕對的,當有很多宏定義展開,目標文件很大,執行的時候運行時系統換頁頻繁,效率就會低下)。而函數調用不使源程序變長。
B. C語言中子函數可以調用宏定義嗎
當然可以,宏定義的作用域為整個文件,文件中所有函數都可以調用
C. c語言函數調用
直接調用即可。如下示例: #include#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) (a>b?a:b),省去內層括弧,則宏展開就成了k = (i&0x0f>j&0x0f?i&0x0f:j&0x0f),運算的優先順序就錯了。同樣道理,這個宏定義的外層括弧也是不能省的。若函數中是宏替換為 ++MAX(a,b),則宏展開就成了 ++(a)>(b)?(a):(b),運算優先順序也是錯了。 3.宏函數往往會導致較低的代碼執行效率。 若是普通函數,則通過遞歸,可取的最大值,時間復雜度為O(n)。但若是宏函數,則宏展開為( a[n]>max(n-1)?a[n]:max(n-1) ),其中max(n-1)被調用了兩遍,這樣依此遞歸下去,時間復雜度會很高。
D. 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)。這一點和數學是不同的,不要強行往數學上靠。
E. C語言中的宏定義如何傳遞形參
給宏傳遞運行時計算的變數是絕無可能辦到的。
不過假如只是這一個循環的話,可以利用預處理展開……
#defineREPEAT_0(f)f(0)
#defineREPEAT_1(f)REPEAT_0(f)f(1)
#defineREPEAT_2(f)REPEAT_1(f)f(2)
#defineREPEAT_3(f)REPEAT_2(f)f(3)
#defineREPEAT_4(f)REPEAT_3(f)f(4)
#defineREPEAT_5(f)REPEAT_4(f)f(5)
#defineREPEAT_6(f)REPEAT_5(f)f(6)
#defineREPEAT_7(f)REPEAT_6(f)f(7)
#defineREPEAT_8(f)ERROR_EXCEED_LIMIT
#defineREPEAT(n,f)REPEAT_##n(f)
/*用法如下*/
#defineLD(n)LEFT_BACK(n);Delay(4);
REPEAT(7,LD)
好處是這個宏是可以重用的,在別的地方也可以使用,並且不佔運行時間。
F. 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; \
}
G. c語言,宏定義,與函數的差別 我覺得宏定義和函數沒什麼差別啊, 是否可以用宏定義代替函數
首先宏定義和函數是有差別的
宏定義是在編譯之前處理的,不做語法檢查。 這個很危險
另外我要說
#define a(b,c) {(b)+(c)}
表示bc之合,在結果上和函數確實一樣
H. c語言問題(宏定義作為函數)
不是你那樣用的
#include<stdio.h>
#include<string.h>
#defineN(type,x,y)typetype##_max(typex,typey){return(x>y?x:y);}
N(int,x,y);//用宏產生一個int_max函數
voidmain()
{
inti=2,j=4;
printf("%d ",int_max(i,j));
}
I. c語言 中 一個函數能調用另一個函數中的#define變數嗎
#define 是宏定義,是最先編譯的,我們使用宏定義一般不在函數內定義,因為這樣做意義不大而且容易造成你提問的理解問題,為了避免不好了解,建議在函數外定義,這樣每個函數都可以使用,才顯示出它的意義。
J. c語言宏定義是不是不僅僅是簡單的宏替換問題,有的時候也可以當做函數調用來使用
宏定義不是函數,編譯器會進行直譯的。譬如你的f(2)被直接翻譯為2*2