巨集定義相關技巧

2021-05-28 18:00:56 字數 1459 閱讀 2915

寫乙個「標準」巨集min,這個巨集輸入兩個引數並返回較小的乙個。另外,當你寫下面的**時會發生什麼事 least = min(*p++, b);

解答:

#define min(a,b) ((a) <= (b) ? (a) : (b))

min(*p++, b)會產生巨集的***

剖析:

這個面試題主要考查面試者對巨集定義的使用,巨集定義可以實現類似於函式的功能,但是它終歸不是函式,而巨集定義中括弧中的「引數」也不是真的引數,在巨集展開的時候對「引數」進行的是一對一的替換。

程式設計師對巨集定義的使用要非常小心,

特別要注意兩個問題:

(1)謹慎地將巨集定義中的「引數」和整個巨集用用括弧括起來。所以,嚴格地講,下述解答:

#define min(a,b) (a) <= (b) ? (a) : (b)

#define min(a,b) (a <= b ? a : b )

都應判0分;

(2)防止巨集的***。

巨集定義#define min(a,b) ((a) <= (b) ? (a) : (b))對min(*p++, b)的作用結果是:

((*p++) <= (b) ? (*p++) : (*p++))

這個表示式會產生***,指標p會作三次++自增操作。

除此之外,另乙個應該判0分的解答是:

#define min(a,b) ((a) <= (b) ? (a) : (b));

這個解答在巨集定義的後面加「;」,顯示編寫者對巨集的概念模糊不清,只能被無情地判0分並被面試官淘汰。

試題4:為什麼標準標頭檔案都有類似以下的結構?

#ifndef __incvxworksh

#define __incvxworksh

#ifdef __cplusplus

extern "c"

#endif

#endif /* __incvxworksh */

解答:

標頭檔案中的編譯巨集

#ifndef __incvxworksh

#define __incvxworksh

#endif

的作用是防止被重複引用。

作為一種物件導向的語言,c++支援函式過載,而過程式語言c則不支援。函式被c++編譯後在symbol庫中的名字與c語言的不同。例如,假設某個函式的原型為:

void foo(int x, int y);

該函式被c編譯器編譯後在symbol庫中的名字為_foo,而c++編譯器則會產生像_foo_int_int之類的名字。_foo_int_int這樣的名字包含了函式名和函式引數數量及型別

資訊,c++就是考這種機制來實現函式過載的。

為了實現c和c++的混合程式設計,c++提供了c連線交換指定符號extern "c"來解決名字匹配問題,函式宣告前加上extern "c"後,則編譯器就會按照c語言的方式將該函式編譯為_foo,這樣c語言中就可以呼叫c++的函式了

巨集定義使用技巧

巨集定義使用技巧 1 把列舉值轉換為字串 define caseenum e case e printf e 2 利用二進位制表示式得到編譯期常量 define cat a,b a b cat 1,2 12 3 給標準斷言新增描述性注釋 define assertmsg a,b assert a b...

程式設計技巧 巨集定義

我們來看看ios的nsassert的定義 if defined nsassertbody define nsassert condition,desc,do pragma pop no extra arg warnings while 0 endif 吊吊的,就是用乙個巨集定義來實現的,那麼我們就不...

巨集定義使用技巧

題這幾天面試題會遇到一些關於define 的用法,在這裡做下總結,紅色部分筆試常見題型。1.防止乙個標頭檔案被重複包含 ifndef comdef h define comdef h 標頭檔案內容 endif 2.得到乙個字的高位和地位位元組 define word lo byte word 255...