預處理指令之define

2021-10-12 10:29:18 字數 1979 閱讀 8647

#define 指令是再學習c語言時接觸的第二個預處理指令,他的基本用法很簡單,但是高階使用卻可以實現很多複雜的功能,正是如此,也容易掉入坑里~

define的最簡單用法就是巨集替換,將乙個巨集替換為指定的替換體。

#define pi 3.1415
這個語句的會將檔案**現的pi(全字匹配,且不在字串中)替換為3.1415。例如下面的語句:

printf

("pi is %f\n"

,pi)

;//輸出結果為:pi is 3.1415

第乙個pi由於在字串中,所有不會被替換,第二個pi被當成乙個常量替換為3.1415。

define進行替換時分為兩大類:類物件巨集類函式巨集

在上面使用例子中使用的就是類物件巨集。其結構如下:

類物件的由三部分組成:預處理指令#define 、巨集名和替換體。

在巨集的名稱中不能出現空格,必須為連續的整體,除了預處理指令和巨集以外都為替換體。

類函式巨集的結構如下:

類函式巨集可以像函式一樣,在巨集名後面的括號內新增引數,並且在替換體中將對應的引數替換。例如圖中求平均值的巨集可以這樣使用。

printf

("4 和 6 的平均值為: %d\n"

,mean(4

,6))

;

#運算子將類函式巨集的引數字串化,例如

#include

#define log_int(x) printf(#x" is :%d\n",x)

intmain

(void

)

輸出為:a is :10在除錯時可使用#運算子將變數名轉換為字串格式化輸出,便於進行除錯。

##運算子將兩個記號組合成乙個記號

其中預處理器記號是巨集定義替換體中「單獨」的詞。

例如:#define four 22

該巨集定義只有乙個記號,即 22

而 #define six 2 * 3

在該巨集定義中有3個記號,分別為"2", 「*」, 「3」

在下面例子中使用##運算子定義了vara1乙個變數,這個變數是由var和a1兩個標記合併產生的。

#include

#define var(x) var##x

#define log_int(x) printf("var"#x " is :%d\n",var##x)

intmain

(void

)

由於使用##運算子可以間接產生符號,所有運用得當在某些情況可以極大的提高效率。

在上面的例子中我什麼使用巨集函式列印時,只能一次列印乙個變數,如何傳遞多個變數到printf中呢?

由於printf的最後乙個引數時可變引數,在使用巨集傳遞引數時也需要是可變引數。

使用...,```va_args``可以解決這個問題。

解決方法如下

#include

#define log(format,...) printf("::log > " format,...)

intmain

(void

)}

文中**可在我的[github]或者gittee中檢視,請多多star⭐

github 位址gitee 位址

預處理指令define

1 用預處理指令 define 宣告乙個常數,用以表明1年中有多少秒 忽略閏年問題 define seconds per year 60 60 24 365 ul 我在這想看到幾件事情 define 語法的基本知識 例如 不能以分號結束,括號的使用,等等 懂得預處理器將為你計算常數表示式的值,因此,...

預處理指令 define

電腦科學裡的巨集 macro 是一種批量處理的稱謂。一般說來,巨集是一種規則或模式,或稱語法替換,用於說明某一特定輸入 通常是字串 如何根據預定義的規則轉換成對應的輸出 通常也是字串 這種替換在預編譯時進行,稱作巨集展開。include define max 100 上述兩個稱為預處理指令,因為它們...

預處理指令 define

enum給整數命名,typedef給型別命名,巨集給一切重新命名 本質 單純的替換 define x y define one 1 one替換成1 define two 1 2 5 巨集不進行任何計算,直接把1 2 5替換 define printf printf d d n one,two pri...