日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

详解C语言中 # 和 ## 的用法

發布時間:2024/1/23 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 详解C语言中 # 和 ## 的用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一句話總結功能:
使用#把宏參數變為一個字符串,用##把兩個宏參數粘連到一起

##用來連接前后兩個參數,拼接符號。可以是符號拼符號,可以是數字拼符號,可以是數字拼數字
#用來對后面的宏參數進行字符串化操作,簡單來說就是相當于在宏變量的兩邊各加上一個雙引號使其變成一個字符串
注意,##和#只可用在宏定義中,這只是給編譯器看的。(語句體中不可直接用##和#)
功能總結很簡單,但實際應用方式卻多種多樣,可謂非常強大。

一、基礎應用:
例1:使用 # ,把一個宏參數變成對應的字符串

#include<stdio.h>#define PRINT(X) printf("the "#X" value is %d\n",X)int main() {int a = 2;PRINT(a);return 0; }

輸出:

the a value is 2

上面的 PRINT(a) 展開相當于 printf(“the " “a” " value is %d\n”,a)
注意里面有三個字符串,打印的時候會拼到一起

例2:##可以把位于它兩邊的符號合成一個符號。 它允許宏定義從分離的文本片段創建標識符

#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)); 相當于 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是科學計數法 2 * 10 ^3return 0; }

二、當有##、#的宏定義時,宏中的參數若還是宏定義,此時該宏不會被展開

#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)); //很明顯,未達到目的

解決方法:加多一層中間轉換宏
加這層宏的用意是把所有宏的參數在這層里全部展開, 那么在轉換宏里的那一個宏 (_INT) (_CON) 就能得到正確的宏參數.

#define X 2 #define MAX_NUM 7000#define _STR(x) #x //轉換宏 #define STR(x) _STR(x)#define _CON(x) int(x##x) #define CON(x) _CON(x) //轉換宏printf("%s", STR(MAX_NUM)); printf("%d", CON(X));//宏定義展開 //printf("%s", "7000"); //printf("%d", 22);

CON(X) =》_CON(X) =》int(22)
STR(MAX_NUM) =》_STR(MAX_NUM) =》“7000”

三、應用舉例

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) {a, #a} enum IDD{OPEN, CLOSE}; typedef struct MSG{ IDD id; const char * msg; }MSG;

MSG _msg[] = {FILL(OPEN), FILL(CLOSE)};
相當于:

MSG _msg[] = {{OPEN, "OPEN"}, {CLOSE, "CLOSE"}};

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语言中 # 和 ## 的用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。