C語言巨集 define中 , , 和 的用法

2021-09-23 14:09:07 字數 2893 閱讀 1493

作用:將巨集定義中的傳入引數名轉換成用一對雙引號括起來引數名字串。其只能用於有傳入引數的巨集定義中,且必須置於巨集定義體中的引數名前。如:

#define example( instr )  printf( "the input string is:\t%s\n", #instr )

#define example1( instr ) #instr

當使用該巨集定義時:

example( abc ); // 在編譯時將會展開成:printf("the input string is:\t%s\n","abc")

string str = example1( abc ); // 將會展成:string str="abc"

注意, 對空格的處理:

a. 忽略傳入引數名前面和後面的空格。

如:str=example1(   abc );//將會被擴充套件成 str="abc"
b.當傳入引數名間存在空格時,編譯器將會自動連線各個子字串,用每個子字串之間以乙個空格連線,忽略剩餘空格。

如:str=exapme( abc    def);//將會被擴充套件成 str="abc def"
作用:將巨集定義的多個形參轉換成乙個實際引數名。

如:

#define examplenum( n )  num##n
使用:

int num9 = 9;

int num = examplenum( 9 ); // 將會擴充套件成 int num = num9

注意:

a. 當用##連線形參時,##前後的空格可有可無。

如:  #define examplenum( n )       num ## n                 

// 相當於 #define examplenum( n ) num##n

b. 連線後的實際引數名,必須為實際存在的引數名或是編譯器已知的巨集定義。

c. 如果##後的引數本身也是乙個巨集的話,##會阻止這個巨集的展開。

#include #include #define strcpy(a, b)   strcpy(a ## _p, #b)

int main()

結果:

var1 = var2

var2 = var1

作用:將傳入單字元引數名轉換成字元,以一對單引用括起來。如:

#define makechar(x)    #@x

char a = makechar( b ); //展開後變成了:a = 'b';

注意 \ 前留空格。

當巨集引數是另乙個巨集的時候,需要注意的是凡巨集定義裡有用』#』或』##』的地方巨集引數是不會再展開。

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

#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

C語言巨集中 和 的用法

c語言巨集中 和 的用法 一 一般用法 我們使用 把巨集引數變為乙個字串,用 把兩個巨集引數貼合在一起.用法 include include using namespace std define str s s define cons a,b int a e b int main printf st...

C語言 巨集中 和 的用法

巨集中 和 的用法 一 一般用法 我們使用 把巨集引數變為乙個字串,用 把兩個巨集引數貼合在一起.用法 include include using namespace std define str s s define cons a,b int a e b int main 二 當巨集引數是另乙個巨...

C語言巨集中 和 的用法

一 一般用法 我們使用 把巨集引數變為乙個字串,用 把兩個巨集引數貼合在一起.用法 include include using namespace std define str s s define cons a,b int a e b int main printf str vck 輸出字串 vc...