再看C C 中的巨集 Macros

2021-04-23 07:27:36 字數 1191 閱讀 7575

通常我們對c/c++中巨集的理解不外乎兩點:

一, 用來處理標頭檔案的重複包含。

二, 用來定義類似的函式的巨集。

define max(a,b)  (a>b)?(a):(b)

類似於這樣的作法主要是想繞過型別檢查,這樣無論a和b是什麼型別之要能用">"運算子來比較的便可以使用巨集來代替反覆寫max函式不同版本。但這樣做明顯有乙個問題:我們缺少了型別保護,這對於大型應用程式來說是非常恐怖的一件事。(但也不盡然)。

c++中引入了范型(generic method)來解決這個問題。

但我今天想表達的全然不是上面這些,c/c++中的巨集還有乙個用處:

**生成器(code generator)。

也許你對此不屑,坦白地講先前我也是如此。這個很明顯嘛,上學的時候我都知道了,比如上面的例子,當你寫出如下的**:

int imax = max(5,6);

編譯器會為你「自動」生成**:

int imax = (5>6)?(5):(6);

確實如此,程式設計三年以來,我確實也是這樣的理解的。直到最近在看graham paul的《ansi common lisp》,前言中有這樣一句話:

macros, for example: lisp programmers can, and often do,

write programs to write their programs for them.

是的,we can write a program

to program for us.

經此一提,抽象層次,思考方式轉然一變:

是呀,我們可以寫出一些程式,這些程式的作用是為我們寫程式。

像繞口令?是有些

結合經驗的話,我覺得vc/mfc的原始碼中經常會出現這種技術/思想的利用。剛開始我總不能理解為什麼mfc的原始碼中總是會插入一些巨集,有些巨集還非常巨大。當時也覺得微軟的這些程式設計師讓人不可思議。現在我知道了:

對於他們(mfc的作者)來說,他們有時在寫程式,有時卻在寫會幫助他們寫程式的程式(巨集)。

原來如此!

一, 看看mfc的原始碼中,找找哪些巨集是generic method,哪些是code generator.

二, 去看看graham paul的《ansi common lisp》;

三, 如果你足夠強,可以看看graham的《on lisp》;

jerry.chou

C C 中巨集的妙用

本文總結記錄一些在工作和學習中碰到的一些對c c 巨集的妙用,大都來自於android,chromium,webkit等開源專案 看到好的巨集的使用,本文也會不定時的更新。一.妙用一 減少重複 1.下例,通過巨集的使用,定義了一系列僅僅關鍵字不同的變數和函式,極大的減少了 的重複。這樣對 進行修改 ...

C,C 巨集中 與 的講解

文中 file 與示例1的可以參見 使用ansi c and microsoft c 中常用的預定義巨集 巨集中的 的功能是將其後面的巨集引數進行字串化操作 stringizing operator 簡單說就是在它引用的巨集變數的左右各加上乙個雙引號。如定義好 define string x x之後...

C,C 巨集中 與 的講解

文中 file 與示例1可以參見 使用 ansi c and microsoft c 中常用的預定義巨集 巨集中的 的功能是將其後面的巨集引數進行字串化操作 stringizing operator 簡單說就是在它引用的巨集變數的左右各加上乙個雙引號。如定義好 define string x x之後...