详解C语言中 # 和 ## 的用法
一句話總結(jié)功能:
使用#把宏參數(shù)變?yōu)橐粋€字符串,用##把兩個宏參數(shù)粘連到一起
##用來連接前后兩個參數(shù),拼接符號。可以是符號拼符號,可以是數(shù)字拼符號,可以是數(shù)字拼數(shù)字
#用來對后面的宏參數(shù)進行字符串化操作,簡單來說就是相當(dāng)于在宏變量的兩邊各加上一個雙引號使其變成一個字符串
注意,##和#只可用在宏定義中,這只是給編譯器看的。(語句體中不可直接用##和#)
功能總結(jié)很簡單,但實際應(yīng)用方式卻多種多樣,可謂非常強大。
一、基礎(chǔ)應(yīng)用:
例1:使用 # ,把一個宏參數(shù)變成對應(yīng)的字符串
輸出:
the a value is 2
上面的 PRINT(a) 展開相當(dāng)于 printf(“the " “a” " value is %d\n”,a)
注意里面有三個字符串,打印的時候會拼到一起
例2:##可以把位于它兩邊的符號合成一個符號。 它允許宏定義從分離的文本片段創(chuàng)建標識符
#include<stdio.h>#define A(X,Y) X##Y int main() {int tmp123 = 123;printf("%d\n", A(tmp, 123));return 0; }輸出:
123
上面的 printf("%d\n", A(tmp, 123)); 相當(dāng)于 printf("%d\n", tmp123);
例3:
#include<stdio.h> #include<limits.h> #define STR(s) #s #define CONS(a,b) (int)(a##e##b) int main() { printf(STR(vck)); // 輸出字符串"vck" printf("%d\n", CONS(2,3)); // 2e3 輸出:2000 2e3是科學(xué)計數(shù)法 2 * 10 ^3return 0; }二、當(dāng)有##、#的宏定義時,宏中的參數(shù)若還是宏定義,此時該宏不會被展開
#define X 2 #define MAX_NUM 7000#define INT(x) #x#define CON(x) int(x##x)printf("%s", INT(MAX_NUM)); printf("%d", CON(X));//宏定義展開后: //printf("%s", "MAX_NUM"); //printf("%d", int(XX)); //很明顯,未達到目的解決方法:加多一層中間轉(zhuǎn)換宏
加這層宏的用意是把所有宏的參數(shù)在這層里全部展開, 那么在轉(zhuǎn)換宏里的那一個宏 (_INT) (_CON) 就能得到正確的宏參數(shù).
CON(X) =》_CON(X) =》int(22)
STR(MAX_NUM) =》_STR(MAX_NUM) =》“7000”
三、應(yīng)用舉例
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;
即每次只能解開當(dāng)前層的宏,所以__LINE__在第二層才能被解開;
2、填充結(jié)構(gòu)
#define FILL(a) {a, #a} enum IDD{OPEN, CLOSE}; typedef struct MSG{ IDD id; const char * msg; }MSG;MSG _msg[] = {FILL(OPEN), FILL(CLOSE)};
相當(dāng)于:
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、得到一個數(shù)值類型所對應(yīng)的字符串緩沖大小
#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”)];
這里相當(dāng)于:
char buf[11];
總結(jié)
以上是生活随笔為你收集整理的详解C语言中 # 和 ## 的用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RT-Thread pin设备驱动代码结
- 下一篇: RT-Thread Pin设备驱动API