c語言中 和 的用法

2021-08-28 22:55:13 字數 2929 閱讀 2583

原文有些錯誤,修正一下。

一、一般用法 

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

用法: 

#include#include#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 #include

這行會被展開為: 

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    //此處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型的最大值,為乙個變數 #include

輸出為: int max: 2147483647 

str(int_max) -->  _str(2147483647) 然後再轉換成字串; 

printf("%d\n", cons(a, a)); 

輸出為:200 

cons(a, a)  -->  _cons(2, 2)  --> int(2e2) 

//#define a         2  //2左右不能加(),(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(2147483647)]; 

-->  char  buf[sizeof("2147483647")]; 

這裡相當於: 

char  buf[11];

C語言中 和 用法

一 基本的用法 1 引數名以 作為字首則結果將被擴充套件為由實際引數的帶引號的字串。如 12 3456 78 define dprint expr printf expr d n expr intmain 上面的例子會列印出 a b 2 2 預處理器運算子 為巨集提供了一種連線實際引數的手段。如果替...

C語言中 和 的用法

今天在看freertos 看到如下 開機初始化 log create module template,print level info 巨集定義 define log create module module,level log control block t log control block m...

C語言中 和 的用法

使用 把巨集引數變為乙個字串,用 把兩個巨集引數貼合在一起.include includeusing namespace std define str s s define cons a,b int a e b int main 當巨集引數是另乙個巨集的時候,需要注意的是凡巨集定義裡有用 或 的地方...