巨集定義中 和 的用法

2022-08-16 13:03:11 字數 1408 閱讀 3640

**:

1. 前言

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

2. 一般用法

#include

#include

using namespace std;

#define str(s) #s

#define cons(a,b) int(a##e##b)

int main()

3. 注意事項

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

即, 只有當前巨集生效, 引數裡的巨集!不!會!生!效 !!!!

3.1 舉例

#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("%s\n", cons(a, a)); // compile error --- int(aea)

兩句print會被展開為:

printf("int max: %s\n","int_max");

printf("%s\n", int(aea));

分析:

由於a和int_max均是巨集,且作為巨集cons和str的引數,並且巨集cons和str中均含有#或者##符號,所以a和int_max均不能被解引用。導致不符合預期的情況出現。

3.2 解決方案

解決這個問題的方法很簡單. 加多一層中間轉換巨集. 加這層巨集的用意是把所有巨集的引數在這層裡全部展開,

那麼在轉換巨集裡的那乙個巨集(_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:0x7fffffff

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

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

//輸出為:200

//cons(a, a) --> _cons((2), (2)) --> int((2)e(2))

C語言巨集定義中 , 和 的用法

1 一般用法 把巨集引數變為乙個字串,把巨集引數變為乙個字元,把兩個巨集引數貼合在一起。include include define str s s 與引數之間可以有空格 define tochar c c define cons a,b int a e b 與引數之間可以有空格 int main ...

巨集中 和 的用法

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

巨集中 和 的用法

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