巨集中"#"和"##"的用法
一、一般用法
我們使用#把巨集引數變為乙個字串,用##把兩個巨集引數貼合在一起.
用法: 1
2
3
4
5
6
7
8
9
10
11
#include
#include
using
namespace
std;
#define str(s) #s
#define cons(a,b) int(a##e##b)
int
main()
二、當巨集引數是另乙個巨集的時候
需要注意的是凡巨集定義裡有用'#'或'##'的地方巨集引數是不會再展開.
1, 非'#'和'##'的情況
1
2
3
#define tow (2)
#define mul(a,b) (a*b)
printf
(
"%d*%d=%d/n"
, tow, tow, mul(tow,tow));
這行的巨集會被展開為: 1
printf
(
"%d*%d=%d/n"
, (2), (2), ((2)*(2)));
mul裡的引數tow會被展開為(2).
2, 當有'#'或'##'的時候
1
2
3
4
#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
這行會被展開為:
1
2
printf
(
"int max: %s/n"
,
"int_max"
);
printf
(
"%s/n"
, cons(a, a));
// compile error
這一行則是:
printf("%s/n", int(aea));
int_max和a都不會再被展開, 然而解決這個問題的方法很簡單. 加多一層中間轉換巨集.
加這層巨集的用意是把所有巨集的引數在這層裡全部展開, 那麼在轉換巨集裡的那乙個巨集(_str)就能得到正確的巨集引數.
1
2
3
4
5
6
7
8
9
10
11
#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、合併匿名變數名 1
2
3
#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、填充結構 1
2
3
4
5
6
7
8
9
10
#define fill(a)
enum
idd;
typedef
struct
msgmsg;
msg _msg = ;
相當於:
msg _msg = ,
};
3、記錄檔名 1
2
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、得到乙個數值型別所對應的字串緩衝大小 1
2
3
4
5
#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語言中的巨集
define pi 3.14 define zhouchang r 2 pi r 定義帶引數的巨集 undef pi 結束巨集 使用 ifdef ifndef else endif執行條件編譯 ifdefine 巨集名稱 語句 else 語句 endif define age 39 int main...
關於C語言中的巨集
巨集 macro,是一種批量處理的稱謂。巨集是一種規則或模式,或稱語法替換。在預編譯時進行,稱作巨集展開。c語言中的巨集定義 1 define是預處理器處理的單元實體之一 2 define定義的巨集可以出現在程式的任意位置 3 define定義之後的 都可以使用這個巨集。定義巨集常量 1 可以直接使...
c語言中關於巨集
我們在寫c語言程式中,已經初步了解到了 define的用法,下面對 define做乙個詳細的用法說明。格式如下 define name stuff有了這條指令之後,每當有name出現,就會被預處理器替換為stuff。例 define reg register define do forever fo...