C和C 中 define的使用方法

2022-02-26 14:22:28 字數 1372 閱讀 1317

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