巨集定義學習

2021-09-06 07:36:52 字數 3331 閱讀 8886

巨集定義怎麼理解?

關於巨集定義,把握住本質:僅僅是一種字元替換,而且是在預處理之前就進行。

巨集定義可以包括分號嗎?

可以,示例**如下:

1 #include2

using

namespace

std;34

#define pi 3.14; //

巨集定義可以包括「;」56

void

main()

7

巨集定義一種新型別如何實現?

示例**如下:

1 #include2

using

namespace

std;

3#define int int *

4void

main()58

//理解此處的微妙:int *a,b; 這條語句同時定義了兩個變數。乙個指標:int *a; 乙個變數:int b;

巨集定義乙個函式如何實現?

示例**如下:

1 #include2

using

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...

從培訓的角度重新定義學習

在寫下這個標題的時候,就在想,如何將我們的學習跟工作結合起來。不至於讓我們感覺學習越學越累!下面就是自己從職業的角度去思考的學習。在不斷的培訓過程中加深自己對一些知識點的理解,這是自己的初衷。在進行在職研的學習過程中,總是想盡辦法去把自己所學習到的一些東西去向同事們分享。因為我明白,真正對於乙個知識...