define的注意事項

2021-08-20 10:42:48 字數 1814 閱讀 6754

1、 用無參巨集定義乙個簡單的常量

#define len 12

這個是最常見的用法,但也會出錯。

比如下面幾個知識點你會嗎?可以看下:

(1)#define name "zhangyuncong"

程式中有"name"則,它會不會被替換呢?

(2)#define 0x abcd

可以嗎?也就是說,可不可以用不是識別符號的字母替換成別的東西?

(3)#define name "zhang 

這個可以嗎?

(4)#define name "zhangyuncong" 

程式中有上面的巨集定義,並且,程式裡有句:

namelist這樣,會不會被替換成"zhangyuncong"list

四個題答案都是十分明確的。

第乙個,""內的東西不會被巨集替換。

第二個,巨集定義前面的那個必須是合法的使用者識別符號

第三個,巨集定義也不是說後面東西隨便寫,不能把字串的兩個""拆開。

第四個:只替換識別符號,不替換別的東西。namelist整體是個識別符號,而沒有name識別符號,所以不替換。

也就是說,這種情況下記住:#define第一位置  第二位置

(1) 不替換程式中字串裡的東西。

(2) 第一位置只能是合法的識別符號(可以是關鍵字)

(3) 第二位置如果有字串,必須把""配對。

(4) 只替換與第一位置完全相同的識別符號

還有就是:記住這是簡單的替換而已,不要在中間計算結果,一定要替換出表示式之後再算。

第乙個引數是合法識別符號,第二個是文字或字串

2:帶引數巨集的用法

比如#define max(a,b) ((a)>(b)?(a):(b))

帶參的巨集,巨集變數和整個都要加括號

則遇到max(1+2,value)則會把它替換成:

((1+2)>(value)?(1+2):(value))

注意事項和無參巨集差不多。

但還是應注意

#define fun(a) "a"

則,輸入fun(345)會被替換成什麼?

其實,如果這麼寫,無論巨集的實參是什麼,都不會影響其被替換成"a"的命運。

也就是說,""內的字元不被當成形參,即使它和一模一樣。

那麼,你會問了,我要是想讓這裡輸入fun(345)它就替換成"345"該怎麼實現呢?

請看下面關於#的用法

3:有引數巨集中關於#的使用

需要注意的是凡巨集定義裡有用'#'或'##'的地方巨集引數是不會再展開,被當做字串處理

#define str(str) #str

#用於把巨集定義中的引數兩端加上字串的""

比如,這裡str(my#name)會被替換成"my#name"

一般由任意字元都可以做形參,但以下情況會出錯:

str())這樣,編譯器不會把「)」當成str()的引數。

str(,)同上,編譯器不會把「,」當成str的引數。

str(a,b)如果實參過多,則編譯器會把多餘的引數捨去。(vc++2008為例)

str((a,b))會被解讀為實參為:(a,b),而不是被解讀為兩個實參,第乙個是(a第二個是b)。

4:有引數巨集中關於##的使用

#define wide(str) l##str

則會將形參str的前面加上l

比如:wide("abc")就會被替換成l"abc"

如果有#define fun(a,b) vo##a##b()

那麼fun(id ma,in)會被替換成void main()

5:多行巨集定義

#define doit(m,n) for(int i=0;i<(n);++i)\

java DOM 注意事項

1.w3c把標籤內的文字部分也定義成乙個node 2.element物件代表的是xml文件中的標籤元素 繼承於node,亦是node的最主要的子物件 3.attr實際上是包含在element中的,它並不能被看作是element的子物件,因而在dom中attr並不是dom樹的一部分,所以node中的 ...

static注意事項

static關鍵字是c,c 中都存在的關鍵字,它主要有三種使用方式,其中前兩種只指在c語言中使用,第三種在c 中使用 c,c 中具體細微操作不盡相同,本文以c 為準 1 區域性靜態變數 2 外部靜態變數 函式 3 靜態資料成員 成員函式 下面就這三種使用方式及注意事項分別說明 一 區域性靜態變數 在...

CSS注意事項

一 寬度 高度 對齊方式請別忘記他們 只要你時刻記得 div css 不變形的秘密你已經掌握了 90 也有對齊方式哦!一定要掌握當 對齊方式不同是 布局出現的問題!左右左 能不變形嗎?預設 是要換行的哦 div css的 居中對齊 是有條件的哦 所有當同級元素的對齊方式都為居中對齊的時候可以採用居中...