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的 居中對齊 是有條件的哦 所有當同級元素的對齊方式都為居中對齊的時候可以採用居中...