define常規的文字替換就不多說明了,
先說一下帶引數的巨集替換,比如
#define add(x, y) (x + y)
需要注意的就是在涉及運算或著其他一些情況下,要加上括號來避免結合律影響運算結果,像5*add(2,3),你期望的結果是25,
但是,在不加括號的情況下 5*2+3 結果是30.
當需要換行時,需要在行尾加上\ 比如:
1#define null_return(varname) \
2if(varname ==nullptr) \
3
下面說下巨集定義中的特殊操作符,包括#,##和__va_args__
#符號說白了就是可以把乙個引數當作字串來處理,避免引數替換,比如:
#define sqr(x) printf("the square of" #x "is %d.\n",(x)*(x))
當我們不希望printf中的x被引數替換時可以加上#號。
##符號簡單理解就是將兩個字串拼接成乙個,比如
#define property_readonly(vartype, funname, varname) \private
: vartype _##varname; \
public: vartype get##funname() const
__va_args__ 是乙個可變引數的巨集,很少人知道這個巨集,這個可變引數的巨集是新的c99規範中新增的,目前似乎只有gcc支援(vc6.0的編譯器不支援)。
實現思想就是巨集定義中引數列表的最後乙個引數為省略號(也就是三個點)。這樣預定義巨集__va_args__就可以被用在替換部分中,替換省略號所代表的字串。
#define pr(...) printf(__va_args__)intmain()
省略號只能代替最後面的巨集引數。
#define w(x,…,y)錯誤!
但是支援#define w(x, …),此時傳入的引數個數必須能夠匹配。
介紹幾個系統巨集:
1) __file__ 預編譯時會替換成當前的源檔名
2) __line__ 預編譯時會替換成當前的行號
3) __function__ 預編譯時會替換成當前的函式名稱
如何取消定義的巨集呢,可以這樣做
//定義巨集#define [macroname] [macrovalue]
//取消巨集
#undef [macroname]
C 中的as和is的使用方法
as和is這兩個關鍵字在c 中還是比較常見的,比如說如果你想判斷乙個資料的型別是否是你指定的型別,那麼可以考慮使用is這個關鍵字,它會返回乙個bool值,如果是則為true,反之則是false。using system using system.collections.generic using s...
C 中stringstream的使用方法和樣例
之前在leetcode中進行string和int的轉化時使用過istringstream,現在大致總結一下用法和測試用例。介紹 c 引入了ostringstream istringstream stringstream這三個類,要使用他們建立物件就必須包含sstream.h標頭檔案。istrings...
C 中stringstream的使用方法和樣例
上述是c 中輸入輸出流類的幾種關係。istringstream是由乙個string物件構造而來,從乙個string物件讀取字元。ostringstream同樣是有乙個string物件構造而來,向乙個string物件插入字元。stringstream則是用於c 風格的字串的輸入輸出的。ignore函式...