C語言 關於巨集的 與

2021-08-13 21:18:00 字數 4708 閱讀 4953

巨集中"#"和"##"的用法

一、一般用法

我們使用#把巨集引數變為乙個字串,用##把兩個巨集引數貼合在一起.

用法: 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)

intmain()

二、當巨集引數是另乙個巨集的時候

需要注意的是凡巨集定義裡有用'#'或'##'的地方巨集引數是不會再展開.

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

輸出為:intmax: 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)

enumidd;

typedefstructmsgmsg;

msg _msg = ;

相當於:

msg _msg = ,

};

3、記錄檔名 1

2

3

#define  _get_file_name(f)   #f

#define  get_file_name(f)    _get_file_name(f)

staticcharfile_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)

charbuf[type_buf_size(int_max)];

-->charbuf[_type_buf_size(0x7fffffff)];

-->charbuf[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...