寫乙個「標準」巨集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...