#define的用法歸類

#define的用法歸類
常規用法不再介紹,做如下幾點說明和介紹

1. 帶參數的宏只完成簡單字符替換,之前不做計算實參的工作,如下

 

#define SUM(x,y) x+y

int a=3,b=2,c=1;
int s;
s
=SUM(a+b,b)*SUM(c,b)+c;

 

            結果應該是 s=a+b+b*c+b+c=10。

2. define中的特殊標識符

#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x

int a=Conn(12,34);
char b=ToChar(a);
char c[]=ToString(a);

結果是 a=1234,c='a',c="1234";

可以看出 ## 是簡單的連接符,#@用來給參數加單引號,#用來給參數加雙引號即轉成字符串。

更神奇的是

#define x(s) #s
   char *s = x(a    b/**/ c);
char *p = x(a/nb);

結果是*s="a b c",*p="a//nb",#s果然很厲害

3.define的多行定義

define可以替代多行的代碼

#define MACRO(arg1, arg2) do {
stmt1;
stmt2;
}
while(0)

關鍵是要在每一個換行的時候加上一個"/"

由此聯想到了C中的關於字符串的一些默認規則

char s1[]="abc"  "efg";
char s2[]="abc"
"efg";
char s3[]="ab/
c";
char s4[]="ab
c";

其中只有s4會產生編譯錯誤,s1="abcefg",s2="abcefg",s3="abc"

4. 宏調用順序

#define A 3
#define B 4
#define AB 5
#define Conn(x,y) x##y

int a=Conn(A,B);

結果是a=5;可見一個宏的參數是另一個宏,先替換外面的宏,後替換參數。即Conn(A,B)=>AB,後AB=>5

5.解決重複定義的問題
由於頭文件包含可以嵌套,那麼C文件就有可能包含多次同一個頭文件,就可能出現重複定義的問題的。
通過條件編譯開關來避免重複包含(重複定義)
例如
#ifndef __headerfileXXX__
#define __headerfileXXX__

文件內容

#endif
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章