在c/c++的巨集中,」#」的功能是將其後面的巨集引數進行字串化操作(stringfication),簡單說就是在對它所引用的巨集變數通過替換後在其左右各加上乙個雙引號。
而」##」被稱為連線符(concatenator),用來將兩個子串token連線為乙個token。注意這裡連線的物件是token就行,而不一定是巨集的變數。還可以n個##符號連線n+1個token,這個特性是#符號所不具備的。
凡是巨集定義裡有用』#』或』##』的地方巨集引數是不會再展開。
若要使』#』和』##』的巨集引數被展開,可以加多一層中間轉換巨集。加這層巨集的用意是把所有巨集的引數在這層裡全部展開,那麼在轉換巨集裡的那乙個巨集就能得到正確的巨集引數。
以下是測試**:
#include "jinghao.hpp"
#include //test1
#define warn_if(exp) \
if (exp) \
fprintf(stderr, "warning: "#exp" \n");
//test2
#define str(s) #s
//test3
#define _stri(s) #s
#define stri(s) _stri(s) //轉換巨集
//test4
#define paster(n) printf("token"#n" = %d\n", token##n)
//test5
#define _cons(a, b) int(a##+##b)
#define cons(a, b) _cons(a, b) //轉換巨集
//test6
#define _get_file_name(f) #f
#define get_file_name(f) _get_file_name(f) //轉換巨集
//test7
#define _type_buf_size(type) sizeof #type
#define type_buf_size(type) _type_buf_size(type)
//test8
#define d(x) #@x //僅對單一標記轉換有效
int test_jinghao1()
#define check_params(condition, ret) \
}int test_jinghao2()
1.
2.
3.
C C 中 和 的用法
c 中 和 的用法一直是非常讓人頭疼的難點,課本部落格上講這些知識點一般都是分開講其用法的,沒有詳細的總結,導致我在這方面的知識結構格外混亂,在網上找到了一篇英文文章簡單總結了這兩個符號的一些用法,都是一些比較基礎的知識,我比較關心的函式指標,指標函式等都沒有涉及到,今後有時間把這部分學明白整理出來...
C C 的巨集中 和 的作用和展開
c c 的巨集中,的功能是將其後面的巨集引數進行字串化操作,簡單說就是在對它所引用的巨集變數通過替換後在其左右各加上乙個雙引號。連線符號由兩個井號組成,其功能是在帶引數的巨集定義中將兩個子串聯接起來,從而形成乙個新的子串。但它不可以是第乙個或者最後乙個子串。凡是巨集定義裡有用 或 的地方巨集引數是不...
c c 巨集中 和 的用法
kennyhe 發表於 2007 2 13 12 25 57 一 一般用法 我們使用 把巨集引數變為乙個字串,用 把兩個巨集引數貼合在一起.用法 i nclude i nclude using namespace std define str s s define cons a,b int a e ...