巨集定義怎麼理解?
關於巨集定義,把握住本質:僅僅是一種字元替換,而且是在預處理之前就進行。
巨集定義可以包括分號嗎?
可以,示例**如下:
1 #include2using
namespace
std;34
#define pi 3.14; //
巨集定義可以包括「;」56
void
main()
7
巨集定義一種新型別如何實現?
示例**如下:
1 #include2using
namespace
std;
3#define int int *
4void
main()58
//理解此處的微妙:int *a,b; 這條語句同時定義了兩個變數。乙個指標:int *a; 乙個變數:int b;
巨集定義乙個函式如何實現?
示例**如下:
1 #include2using
namespace
std;34
#define begin()
10//
如果中的**太多,應該使用巨集連線
11//
**如下所示:
12#define begin()
對巨集定義歧義現象怎麼識別?
示例**如下:
1#define sum(x,y) x*y
2#define summ(x,y) ((x)*(y))
3void
main()
4
求乙個數的平方正確的巨集定義:
#define s(r) ((r)*(r))
這個巨集定義注意事項:
(1)巨集名和引數的括號間不能有空格
(2)巨集替換只作替換,不做計算,不做表示式的求解
(3)函式呼叫在編譯後程式執行時進行,並且分配記憶體。巨集替換在編譯前執行,不分配記憶體
(4)巨集的啞實結合不存在型別,也沒有型別轉換
(5)函式只有乙個返回值,利用巨集則可以設法得到多個值
(6)巨集展開使源程式變長,函式呼叫不會
(7)巨集展開不佔執行時間,只佔編譯時間,函式呼叫佔執行時間(分配記憶體 保留現場 值傳遞 返回值)
何謂啞實結合?
示例**及解釋如下:
1#define s(a,b) a*b
2void
main()
3
下面巨集定義特例如何解析?
示例**如下:
1#define name "zhangyuncong"2//
#define ab "liu
//error!!編譯錯誤3//
#define 0x abcd
//error!!編譯錯誤
4void
main()
5
也就是說,這種情況下記住:#define 第一位置 第二位置
(1)不替換程式中的字串內的任何內容
(2)第一位置只能是合法的識別符號(可以是關鍵字)
(3)第二位置如果有字串,必須把「」配對
(4)只替換與第一位置完全相同的識別符號
總之一句話:僅僅只是簡單的替換而已,不要在中間計算結果,一定要替換出表示式之後再計算
巨集定義的特例有參形式如何解析?
示例**如下:
1#define fun(a) "a"
2void
main()
3
通過上例可以看到,如果這樣寫,不論實參是什麼,都不會擺脫被替換為「a」的命運。也許,你會問,那麼我要實現fun(345)被替換為「345」??腫麼辦呢??
請看下面這個用法
有參巨集定義中#的有何作用?
示例**如下:
1#define str(str) #str 23
void
main()
4
備註:**編譯環境為vs2010 那麼相信「#」的作用也一目了然。在此不作贅述。 有
參巨集定義中##有何作用?
示例**如下:
1#define sign( x ) int_##x
2#define wide(str) l##str34
void
main()
5
當乙個巨集自己呼叫自己時,會發生什麼呢?
例如:#define test(x) ( x + test( x ) )
test(1); 會發生什麼呢?為了防止無限制遞迴展開,語法規定:當乙個巨集遇到自己時,就停止展開。
也就是說,當對test(1)進行展開時,展開過程中又發現了乙個test,那麼就將這個test當作乙個
一般的符號。test(1)最終被展開為:1 + test(1)。
可以舉乙個變參巨集的例子嗎?
示例**如下:
1#define log( format,... ) printf( format, __va_args__ )23
void
main()
4
當巨集作為引數被放進另乙個巨集體時,將會發生什麼?
當乙個巨集引數被放進巨集體時,這個巨集引數會首先被全部展開(當然,沒有絕對,也有例外)。當展開後的巨集引數被放進巨集體時,
預處理器對新展開的巨集體進行第二次掃瞄。並繼續展開。舉例說明:
示例**如下:
1#define param(x) x
2#define addparam(x) int_##x34
void
main()
5
因為addparam(1)是作為param的巨集引數,所以先將addparam(1)展開為int_1,然後再將int_1放進param。
也有例外,如果param巨集內對巨集引數使用了# 或者 ## ,那麼巨集引數不再被展開。例如:
#define param( x ) #x
#define addparam( x ) int_##x
param( addparam( 1 ) ); 將被展開為"addparam( 1 )"。
good good study, day day up.
順序 選擇 迴圈 總結
巨集定義學習
巨集定義學習 1 巨集名一般用大寫 2 使用巨集可提高程式的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如 陣列大小常用巨集定義 3 預處理是在編譯之前的處理,而編譯工作的任務之一就是語法檢查,預處理不做語法檢查。4 巨集定義末尾不加分號 5 巨集定義寫在函式的花括號外邊,作用域為其後的...
自定義學習 摩天輪原理
這個例子是從課堂上拿過來的 是乙個很好的例子,可以學習手勢識別,以及事件分發,特別是轉動速度和滑動之間的關係。public class skywheel extends relativelayout public skywheel context context,attributeset attrs...
從培訓的角度重新定義學習
在寫下這個標題的時候,就在想,如何將我們的學習跟工作結合起來。不至於讓我們感覺學習越學越累!下面就是自己從職業的角度去思考的學習。在不斷的培訓過程中加深自己對一些知識點的理解,這是自己的初衷。在進行在職研的學習過程中,總是想盡辦法去把自己所學習到的一些東西去向同事們分享。因為我明白,真正對於乙個知識...