[c、c++]巨集中"#"和"##"的用法(zz)
巨集中"#"和"##"的用法
一、一般用法
我們使用#把巨集引數變為乙個字串,用##把兩個巨集引數貼合在一起.
用法:
#include#includeusing namespace std;#define str(s) #s
#define cons(a,b) int(a##e##b)
int main()
二、當巨集引數是另乙個巨集的時候
需要注意的是凡巨集定義裡有用'#'或'##'的地方巨集引數是不會再展開.
1, 非'#'和'##'的情況
#define tow (2)#define mul(a,b) (a*b)
printf("%d*%d=%d/n", tow, tow, mul(tow,tow));
這行的巨集會被展開為:
printf("%d*%d=%d/n", (2), (2), ((2)*(2)));
mul裡的引數tow會被展開為(2).
2, 當有'#'或'##'的時候
#define a (2)#define str(s) #s
#define cons(a,b) int(a##e##b)
printf("int max: %s/n", str(int_max)); // int_max #i nclude
這行會被展開為:
printf("int max: %s/n", "int_max");printf("%s/n", cons(a, a)); // compile error
這一行則是:
printf("%s/n", int(aea));
int_max和a都不會再被展開, 然而解決這個問題的方法很簡單. 加多一層中間轉換巨集.
加這層巨集的用意是把所有巨集的引數在這層裡全部展開, 那麼在轉換巨集裡的那乙個巨集(_str)就能得到正確的巨集引數.
#define a (2)#define _str(s) #s
#define str(s) _str(s) // 轉換巨集
#define _cons(a,b) int(a##e##b)
#define cons(a,b) _cons(a,b) // 轉換巨集
printf("int max: %s/n", str(int_max)); // int_max,int型的最大值,為乙個變數 #i nclude輸出為: int max: 0x7fffffff
str(int_max) --> _str(0x7fffffff) 然後再轉換成字串;
printf("%d/n", cons(a, a));
輸出為:200
cons(a, a) --> _cons((2), (2)) --> int((2)e(2))
三、'#'和'##'的一些應用特例
1、合併匿名變數名
#define ___anonymous1(type, var, line) type var##line#define __anonymous0(type, line) ___anonymous1(type, _anonymous, line)
#define anonymous(type) __anonymous0(type, __line__)
例:anonymous(static int); 即: static int _anonymous70; 70表示該行行號;
第一層:anonymous(static int); --> __anonymous0(static int, __line__);
第二層: --> ___anonymous1(static int, _anonymous, 70);
第三層: --> static int _anonymous70;
即每次只能解開當前層的巨集,所以__line__在第二層才能被解開;
2、填充結構
#define fill(a)enum idd;
typedef struct msgmsg;
msg _msg = ;
相當於:
msg _msg = ,
};
3、記錄檔名
#define _get_file_name(f) #f#define get_file_name(f) _get_file_name(f)
static char file_name = get_file_name(__file__);
4、得到乙個數值型別所對應的字串緩衝大小
#define _type_buf_size(type) sizeof #type#define type_buf_size(type) _type_buf_size(type)
char buf[type_buf_size(int_max)];
--> char buf[_type_buf_size(0x7fffffff)];
--> char buf[sizeof "0x7fffffff"];
這裡相當於:
char buf[11];
C語言 關於巨集的 與
巨集中 和 的用法 一 一般用法 我們使用 把巨集引數變為乙個字串,用 把兩個巨集引數貼合在一起.用法 1 2 3 4 5 6 7 8 9 10 11 include include usingnamespacestd define str s s define cons a,b int a e b...
關於巨集定義中 與 的用法
巨集在條件編譯以及各種大規模的定義裡是非常有用的。前面qt原始碼學習筆記裡就有一篇用來介紹巨集的定義。這次主要介紹下巨集定義裡 的作用。關於巨集,注意可以用gcc e test.cpp來檢視預編譯之後的結果。1.先介紹 主要是字串替換的作用。將傳入的符號轉化為字串 直接上源 define marco...
關於巨集定義
一 巨集替換 1.巨集展開的順序 先由外層向內層檢查,直至最內層後依次向外層展開。例外 遇到 開頭的巨集就不再往內檢查,從該層開始往外展開。2.重新掃瞄和替換 在替換列表中的所有引數替換過之後,預處理器將對結果token序列重新掃瞄以便對其中的巨集再次替換。當正在替換的巨集在其替換列表中發現自身時,...