複製鏈接
請複製以下鏈接發送給好友

define

(計算機專業用語)

鎖定
define,定義,C語言預處理命令一種。分為無參宏定義和帶參宏定義。無參宏定義的一般形式為:#define 宏名 字符串;帶參宏定義的一般形式為:#define 宏名(參數表) 字符串
PHP中define 函數定義一個常量。常量類似變量,不同之處在於:在設定以後,常量的值無法更改。常量名不需要開頭的美元符號 ($)。作用域不影響對常量的訪問 。常量值只能是字符串或數字。
中文名
宏定義
外文名
define
詞條範圍
計算機專業用語
無參一般形式
#define 宏名字符串
帶參一般形式
#define 宏名(參數表) 字符串
條件編譯
#ifdef、#ifndef、#undef

define概念

#define 命令是 C 語言中的一個宏定義命令 ,它用來將一個標識符定義為一個字符串 , 該標識符被稱為宏名, 被定義的字符串稱為替換文本。 [1]  該命令有兩種格式:一種是簡單的宏定義, 另一種是帶參數的宏定義。

define分類

define無參宏定義

C語言中無參宏定義的一般形式為:#define 宏名 字符串 [2] 
其中的“#”表示這是一條預處理命令。凡是以“#”開頭的均為預處理命令。“define”為宏定義命令。“標識符”為所定義的宏名。“字符串”可以是常數、表達式、格式串等。
例如: #define M (a+b) 它的作用是指定標識符M來代替表達式(a+b)。在編寫源程序時,所有的(a+b)都可由M代替,而對源程序作編譯時,將先由預處理程序進行宏代換,即用(a+b)表達式去置換所有的宏名M,然後再進行編譯。
程序1:
#include<stdio.h>

#define M (a+b)

int main(void)

{
    
int s,a,b;
    
printf("inputnumbera&b:");
    
scanf("%d%d",&a,&b);
    
s = M*M;
    
printf("s=%d\n",s);

}
上例程序中首先進行宏定義,定義M來替代表達式(a+b),在 s= M * M 中作了宏調用。在預處理時經宏展開後該語句變為: S=(a+b)*(a+b) 。但要注意的是,在宏定義中表達式(a+b)兩邊的括號不能少。否則會發生錯誤。  如當作以下定義後:#define M (a)+(b)  在宏展開時將得到下述語句:S= (a)+(b)*(a)+(b)。
對於宏定義還要説明以下幾點:
1.宏定義是用宏名來表示一個字符串,在宏展開時又以該字符串取代宏名,這只是一種簡單的代換,字符串中可以含任何字符,可以是常數,也可以是表達式,預處理程序對它不作任何檢查。如有錯誤,只能在編譯已被宏展開後的源程序時發現。
2.宏定義不是説明或語句,在行末不必加分號,如加上分號則連分號也一起置換。
3.宏定義其作用域為宏定義命令起到源程序結束。如要終止其作用域可使用#undef命令。

define帶參宏定義

C語言允許宏帶有參數。在宏定義中的參數稱為形式參數,在宏調用中的參數稱為實際參數對帶參數的宏,在調用中,不僅要宏展開,而且要用實參去代換形參
帶參宏定義的一般形式為:  #define 宏名形參表)字符串 [2] 
在字符串中含有各個形參。 帶參宏調用的一般形式為:  宏名(形參表)
例如:
#define M(y) ((y)*(y)+3*(y))/*宏定義*/
k=M(5);/*宏調用*/
在宏調用時,用實參5去代替形參y,經預處理宏展開後的語句為:  k=5*5+3*5
程序2:
#include<stdio.h>


#define MAX(a,b) ((a>b)?(a):(b))


int main(int argc,char *argv[])


{
    
    
    int x,y,max;
    
    
    printf("input two numbers:\n");
    
    
    scanf("%d%d",&x,&y);
    
    
    max=MAX(x,y);
    
    
    printf("max=%d\n",max);
    
    
    return 0;


}
上例程序的第二行進行帶參宏定義,用宏名MAX表示條件表達式 (a>b)?a:b ,形參a,b均出現在條件表達式中。程序中 max=MAX(x,y) 為宏調用,實參x,y,將代換形參a,b。宏展開後該語句為: max=(x>y)?x:y;  用於計算x,y中的大數。

define優點

(1) 方便程序修改 [3] 
使用簡單宏定義可用宏代替一個在程序中經常使用的常量,這樣在將該常量改變時,不用對整個程序進行修改,只修改宏定義的字符串即可,而且當常量比較長時, 我們可以用較短的有意義的標識符來寫程序,這樣更方便一些。我們所説的常量改變不是在程序運行期間改變,而是在編程期間的修改,舉一個大家比較熟悉的例 子,圓周率π是在數學上常用的一個值,有時我們會用3.14來表示,有時也會用3.1415926等,這要看計算所需要的精度,如果我們編制的一個程序中 要多次使用它,那麼需要確定一個數值,在本次運行中不改變,但也許後來發現程序所表現的精度有變化,需要改變它的值, 這就需要修改程序中所有的相關數值,這會給我們帶來一定的不便,但如果使用宏定義,使用一個標識符來代替,則在修改時只修改宏定義即可,還可以減少輸入 3.1415926這樣長的數值多次的情況,我們可以如此定義 #define pi 3.1415926,既減少了輸入又便於修改。
(2) 提高運行效率 [3] 
使用帶參數的宏定義可完成函數調用的功能,又能減少系統開銷,提高運行效率。正如C語言中所講,函數的使用可以使程序更加模塊化,便於組織,而且可重複利用,但在發生函數調用時,需要保留調用函數的現場,以便子函數執行結束後能返回繼續執行,同樣在子函數執行完後要恢復調用函數的現場,這都需要一定的時間,如果子函數執行的操作比較多,這種轉換時間開銷可以忽略,但如果子函數完成的功能比較少,甚至於只完成一點操作,如一個乘法語句的操作,則這部分轉換開銷就相對較大了,但使用帶參數的宏定義就不會出現這個問 題,因為它是在預處理階段即進行了宏展開,在執行時不需要轉換,即在當地執行。宏定義可完成簡單的操作,但複雜的操作還是要由函數調用來完成,而且宏定義所佔用的目標代碼空間相對較大。所以在使用時要依據具體情況來決定是否使用宏定義。

define條件編譯

一般情況下,源程序中所有的行都參加編譯,但是有時希望只對其中一部分內容在滿足一定條件時才進行編譯,這時就需要使用到一些條件編譯命令。而在#if條件編譯命令中,需要判斷符號常量所定義的具體值,但有時並不需要判斷具體值,只需要知道這個符號常量是否被定義了。這時就不需要使用#if,而採用#ifdef#ifndef,分別表示“如果有定義”及“如果無定義”。同時,如果我們需要刪除事先定義的定義,可以使用#undef命令。 [2] 

define#ifdef

如果有定義的#ifdef的一般形式為:#ifdef 宏替換名 語句段 #endif
含義為:如果宏替換名已被定義過,則對“語句段”進行編譯;如果未定義#ifdef後面的宏替換名,則不對語句段進行編譯。

define#ifndef

如果無定義的#ifndef的一般形式為:#ifndef 宏替換名 語句段 #endif
含義為:如果未定義#ifndef後面的宏替換名,則對“語句段1”進行編譯;如果定義#ifndef後面的宏替換名,則不執行語句段。

define#undef

#undef命令可以刪除事先定義了的宏定義。
#undef命令的一般形式如下:#undef 宏替換名
例子:
#define MAX_SIZE 100
char array[MAX_SIZE];
#undef   MAX_SIZE
上述代碼中,首先使用#define定義標識符MAX_SIZE,直到遇到#undef語句之前,MAX_SIZE的定義都是有效的。
説明:#undef的主要目的是將宏名侷限在僅需要它們的代碼段中。

definePHP中define用法

define概念

不同於C語言中的#define,PHP中define() 函數定義一個常量。常量類似變量,不同之處在於:在設定以後,常量的值無法更改。常量名不需要開頭的美元符號 ($)。作用域不影響對常量的訪問常量值只能是字符串或數字。 [4] 

define例子 1

定義一個大小寫敏感的常量:
<?phpdefine("GREETING","Helloworld!");echoconstant("GREETING");?>
輸出:
Hello world!

define例子 2

定義一個大小寫不敏感的常量:
<?phpdefine("GREETING","Helloworld!",TRUE);echoconstant("greeting");?>
輸出:
Hello world!
參考資料
  • 1.    呂鳳翥.C++語言基礎教程 [M]:北京:清華大學出版社,1999
  • 2.    王娣,韓旭等.C語言從入門到精通:清華大學出版社,2010.7:344-347;352-354
  • 3.    宋雅娟, 劉剛. C語言中使用#define常見問題解析[J]:長春大學學報,2005
  • 4.    PHP define() 函數  .W3School