巨集定義是比較常用的預處理指令,即使用「識別碼」來表示「替換清單」中的內容。識別符稱為巨集名,在預處理過程中,預處理器會把來源程式中所有宏名,替換成巨集定義中替換清單中的內容。
常見的巨集定義有兩種,不帶參數的巨集定義和帶參數的巨集定義。
巨集定義可以幫助我們防止出錯,提高程式碼的可移植性和可讀性等。
在軟體開發過程中,常有一些常用或通用的功能或程式碼片段,這些功能既可以寫成函數,也可以封裝成為巨集定義。那麼究竟是用函數好,還是巨集定義好呢?這就要求我們對二者進行合理的取捨。
我們來看一個例子,比較兩個數字或表達式大小,首先我們把它寫成巨集定義:
#define MAX( a, b) ( (a) > (b) (a) : (b) ) # 其次,把它用函数来实现: int max( int a, int b) { return (a > b a : b) }
很顯然,我們不會選擇用函數來完成這個任務,原因有二:首先,函數呼叫會帶來額外的開銷,它需要開闢一片堆疊空間,記錄回傳位址,將形參壓棧,從函數傳回也要釋放堆疊。這種開銷不僅會降低程式碼效率,而且程式碼量也會大大增加,而使用巨集定義則在程式碼規模和速度方面都比函數更勝一籌;其次,函數的參數必須被宣告為一種特定的類型,所以它只能在類型合適的表達式上使用,我們如果要比較兩個浮點型的大小,就得再寫一個專門針對浮點型的比較函數。反之,上面的那個巨集定義可以用於整形、長整形、單浮點型、雙浮點型以及其他任何可以用「>」運算子比較值大小的類型,也就是說,巨集是與型別無關的。
和使用函數相比,使用巨集的不利之處在於每次使用巨集時,一份巨集定義程式碼的拷貝都會插入程式中。除非巨集非常短,否則使用巨集會大幅增加程式的長度。
以上是c語言怎麼定義巨集定義的詳細內容。更多資訊請關注PHP中文網其他相關文章!