共找到2條詞條名為define的結果 展開

define

計算機專業用語

define,宏定義,C語言中預處理命令一種。分為無參宏定義和帶參宏定義。無參宏定義的一般形式為:#define 宏名 字元串;帶參宏定義的一般形式為:#define 宏名(參數表) 字元串。

概念


#define命令是C語言中的一個宏定義命令,它用來將一個標識符定義為一個字元串,該標識符被稱為宏名,被定義的字元串稱為替換文本。該命令有兩種格式:一種是簡單的宏定義,另一種是帶參數的宏定義。
PHP中define 函數定義一個常量。常量類似變數,不同之處在於:在設定以後,常量的值無法更改。常量名不需要開頭的美元符號 ($)。作用域不影響對常量的訪問 。常量值只能是字元串或數字。

條件編譯


一般情況下,源程序中所有的行都參加編譯,但是有時希望只對其中一部分內容在滿足一定條件時才進行編譯,這時就需要使用到一些條件編譯命令。而在#if條件編譯命令中,需要判斷符號常量所定義的具體值,但有時並不需要判斷具體值,只需要知道這個符號常量是否被定義了。這時就不需要使用#if,而採用#ifdef和#ifndef,分別表示“如果有定義”及“如果無定義”。同時,如果我們需要刪除事先定義的宏定義,可以使用#undef命令。 
#ifdef
如果有定義的#ifdef的一般形式為:#ifdef宏替換名語句段#endif
含義為:如果宏替換名已被定義過,則對“語句段”進行編譯;如果未定義#ifdef後面的宏替換名,則不對語句段進行編譯。
#ifndef
如果無定義的#ifndef的一般形式為:#ifndef宏替換名語句段#endif
含義為:如果未定義#ifndef後面的宏替換名,則對“語句段1”進行編譯;如果定義#ifndef後面的宏替換名,則不執行語句段。
#undef
#undef命令可以刪除事先定義了的宏定義。
#undef命令的一般形式如下:#undef宏替換名
例子:
1
2
3
#define MAX_SIZE 100
char array[MAX_SIZE];
#undef MAX_SIZE
上述代碼中,首先使用#define定義標識符MAX_SIZE,直到遇到#undef語句之前,MAX_SIZE的定義都是有效的。
說明:#undef的主要目的是將宏名局限在僅需要它們的代碼段中。

參數


#defineGPEBLT_FUNCNAME(basename)(SCODE(GPE::*)(structGPEBltParms*))&GPE::##basename
在#define中,標準只定義了#和##兩種操作。#用來把參數轉換成字元串,##則用來連接前後兩個參數,把它們變成一個字元串。
輸出為:token9=10
詳見百科typedef(相似)。

作用


被定義為“宏”的標識符稱為“宏名”。在編譯預處理時,對程序中所有出現的“宏名”,都用宏定義中的字元串去代換,這稱為“宏代換”或“宏展開”。宏定義是由源程序中的宏定義命令完成的。宏代換是由預處理程序自動完成的。
宏定義的作用範圍僅限於當前文件,即file1.c中定義#definePI3.14,在file2.c中該宏定義不起作用;通過將#definePI3.14定義在common.h中,file1.c和file2.c分別#include"common.h"的方式,該宏定義在file1.c和file2.c中都起作用。
在C或C++語言中,“宏”分為有參數和無參數兩種。

宏定義優點


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

無參宏定義


無參宏定義的一般形式為:#define標識符字元串
其中的“#”表示這是一條預處理命令。凡是以“#”開頭的均為預處理命令。“define”為宏定義命令。“標識符”為所定義的宏名。“字元串”可以是常數、表達式、格式串等。
例如:#defineM(a+b) 它的作用是指定標識符M來代替表達式(a+b)。在編寫源程序時,所有的(a+b)都可由M代替,而對源程序作編譯時,將先由預處理程序進行宏代換,即用(a+b)表達式去置換所有的宏名M,然後再進行編譯。
程序1:
上常式序中首先進行宏定義,定義M來替代表達式(a+b),在s=M*M中作了宏調用。在預處理時經宏展開后該語句變為:S=(a+b)*(a+b) 但要注意的是,在宏定義中表達式(a+b)兩邊的括弧不能少。否則會發生錯誤。如當作以下定義后:#defineM(a)+(b) 在宏展開時將得到下述語句:S=(a)+(b)*(a)+(b)
對於宏定義還要說明以下幾點:
1.宏定義是用宏名來表示一個字元串,在宏展開時又以該字元串取代宏名,這只是一種簡單的代換,字元串中可以含任何字元,可以是常數,也可以是表達式,預處理程序對它不作任何檢查。如有錯誤,只能在編譯已被宏展開后的源程序時發現。
2.宏定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換。
3.宏定義其作用域為宏定義命令起到源程序結束。如要終止其作用域可使用#undef命令。 (有關#undef請查閱其他資料)

帶參宏定義


c語言允許宏帶有參數。在宏定義中的參數稱為形式參數,在宏調用中的參數稱為實際參數。對帶參數的宏,在調用中,不僅要宏展開,而且要用實參去代換形參。
帶參宏定義的一般形式為: #define宏名(形參表)字元串
在字元串中含有各個形參。帶參宏調用的一般形式為:宏名(形參表)
例如:
在宏調用時,用實參5去代替形參y,經預處理宏展開后的語句為: k=5*5+3*5
程序2:
上常式序的第一行進行帶參宏定義,用宏名MAX表示條件表達式(a>b)?a:b,形參a,b均出現在條件表達式中。程序中max=MAX(x,y)為宏調用,實參x,y,將代換形參a,b。宏展開后該語句為:max=(x>y)?x:y; 用於計算x,y中的大數。
#define條件編譯
頭文件(.h)可以被頭文件或C文件包含;重複包含(重複定義)由於頭文件包含可以嵌套,那麼C文件就有可能包含多次同一個頭文件,就可能出現重複定義的問題的。通過條件編譯開關來避免重複包含(重複定義)

例子


例子1

定義一個大小寫敏感的常量:
輸出:

例子2

定義一個大小寫不敏感的常量:
輸出:
Helloworld!