在c/c++的巨集中,」#」的功能是將其後面的巨集引數進行字串化操作(stringfication),簡單說就是在對它所引用的巨集變數通過替換後在其左右各加上乙個雙引號。
而」##」被稱為連線符(concatenator),用來將兩個子串token連線為乙個token。注意這裡連線的物件是token就行,而不一定是巨集的變數。還可以n個##符號連線n+1個token,這個特性是#符號所不具備的。
凡是巨集定義裡有用』#』或』##』的地方巨集引數是不會再展開。
若要使』#』和』##』的巨集引數被展開,可以加多一層中間轉換巨集。加這層巨集的用意是把所有巨集的引數在這層裡全部展開,那麼在轉換巨集裡的那乙個巨集就能得到正確的巨集引數。
以下是測試**:?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include stdafx.h
#include
using namespace std;
//test1
#define warn_if(exp)
if
(exp)
fprintf(stderr, warning: #exp
);
//test2
#define str(s) #s
//test3
#define _stri(s) #s
#define stri(s) _stri(s)
//轉換巨集
//test4
#define paster(n) printf(token#n = %d
, 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
main(
int
argc,
char
* argv)
{
//test1
int
divider =
0
;
warn_if(divider ==
0
);
//warning: divider == 0
//test2
printf(
int
max: %s
, str(int_max));
//int max: int_max
//test3
printf(
int
max: %s
, stri(int_max));
//int max: 2147483647
//test4
int
token9 =
9
;
paster(
9
);
//token9 = 9
//test5
int
a =
15
, b =
2
;
printf(a + b = %d
, cons(a, b));
//a + b = 17
//test6
char
file_name = get_file_name(__file__);
cout<
PYTHON第一百天筆記1 16 星期二
mongodb db.collection.update upsert multi writeconcern upsert 可選,預設為false,代表如果不存在update的記錄不更新也不插入,設定為true代表插入。使用這個引數,如果obj修改的id和原表中存的id一樣,那麼會報錯 解決 把ob...
python第一天和第二天
資料型別 1.1基本資料型別 數值型 整數型 浮點型 布林型 判斷條件成不成立 字元型 ord 檢視字元所對應的編碼 chr 檢視編碼所對應的字元 問題 字串裡包含引號怎莫辦?答 用轉義字元 n 換行 t 製表 換行的另外方法 1.2復合資料型別 輸入乙個數判斷型別 1.3資料型別轉換 int 字元...
百度前端技術學院 第一 二天整理
1 html是什麼,html5是什麼 html全名為hyper text markup language 超文字標記語言,html5表示他的第五代,是最新的html標準,擁有更豐富的語義 圖形以及多 元素等內容。2 html元素標籤 屬性都是什麼概念 html元素標籤是指文字下的被瀏覽器解析的東西,...