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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

关于gcc扩展中的宏定义中用 # 和 ##

發(fā)布時間:2023/12/18 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于gcc扩展中的宏定义中用 # 和 ## 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
關(guān)于gcc擴展中的宏定義中用 "#" 和 "##"

今天測試了宏定義中的 "#" 和 "##" 的區(qū)別。

結(jié)果如下:

"#" 代表和一個字符串相連接

"##" 代表和一個符號連接,符號可以是變量,或另一個宏符號。

舉例如下:

宏定義如下

(1)

#define DEV_FILE_NAME??? "/dev/test_kft"

#define OPEN_FILE(fd, n)??? /
{?? /
??? fd = open(DEV_FILE_NAME #n,O_RDONLY); /
??? if(fd < 0) /
??? { /
?????? printf("Open device error/n"); /
??????? return 0; /
??? }?? /
}

如此調(diào)用:

??? OPEN_FILE(fd1, 1);
??? OPEN_FILE(fd2, 2);
??? OPEN_FILE(fd3, 3);
??? OPEN_FILE(fd4, 4);
??? OPEN_FILE(fd5, 5);
??? OPEN_FILE(fd6, 6);

用gcc -E展開后,如下

2299:??? { fd1 = open("/dev/test_kft" "1",00); if(fd1 < 0) { printf("Open device error/n"); return 0; } };
2300:??? { fd2 = open("/dev/test_kft" "2",00); if(fd2 < 0) { printf("Open device error/n"); return 0; } };
2301:??? { fd3 = open("/dev/test_kft" "3",00); if(fd3 < 0) { printf("Open device error/n"); return 0; } };
2302:??? { fd4 = open("/dev/test_kft" "4",00); if(fd4 < 0) { printf("Open device error/n"); return 0; } };
2303:??? { fd5 = open("/dev/test_kft" "5",00); if(fd5 < 0) { printf("Open device error/n"); return 0; } };
2304:??? { fd6 = open("/dev/test_kft" "6",00); if(fd6 < 0) { printf("Open device error/n"); return 0; } };

如果沒有定義DEV_FILE_NAME ,就是

2299:??? { fd1 = open(DEV_FILE_NAME "1",00); if(fd1 < 0) { printf("Open device error/n"); return 0; } };
2300:??? { fd2 = open(DEV_FILE_NAME "2",00); if(fd2 < 0) { printf("Open device error/n"); return 0; } };
2301:??? { fd3 = open(DEV_FILE_NAME "3",00); if(fd3 < 0) { printf("Open device error/n"); return 0; } };
2302:??? { fd4 = open(DEV_FILE_NAME "4",00); if(fd4 < 0) { printf("Open device error/n"); return 0; } };
2303:??? { fd5 = open(DEV_FILE_NAME "5",00); if(fd5 < 0) { printf("Open device error/n"); return 0; } };
2304:??? { fd6 = open(DEV_FILE_NAME "6",00); if(fd6 < 0) { printf("Open device error/n"); return 0; } };

所以可以很清楚的看出#n 解析出來的是"n" , 用于連接一個已有的字符串。

(2) 再來看 ## 是什么意思, 宏定義如下:

#define OPEN_FILE(fd, n)??? /
{?? /
??? fd = open(DEV_FILE_NAME ##n,O_RDONLY); /
??? if(fd < 0) /
??? { /
?????? printf("Open device error/n"); /
??????? return 0; /
??? }?? /
}

調(diào)用方式相同。

看宏展開:

2299:??? { fd1 = open(DEV_FILE_NAME1,00); if(fd1 < 0) { printf("Open device error/n"); return 0; } };
2300:??? { fd2 = open(DEV_FILE_NAME2,00); if(fd2 < 0) { printf("Open device error/n"); return 0; } };
2301:??? { fd3 = open(DEV_FILE_NAME3,00); if(fd3 < 0) { printf("Open device error/n"); return 0; } };
2302:??? { fd4 = open(DEV_FILE_NAME4,00); if(fd4 < 0) { printf("Open device error/n"); return 0; } };
2303:??? { fd5 = open(DEV_FILE_NAME5,00); if(fd5 < 0) { printf("Open device error/n"); return 0; } };
2304:??? { fd6 = open(DEV_FILE_NAME6,00); if(fd6 < 0) { printf("Open device error/n"); return 0; } };

現(xiàn)在看清楚了, ##n 的作用是把n直接連接在了一個符號的末尾. 好, 現(xiàn)在我們定義一個符號看看效果。

#define DEV_FILE_NAME1??? "/dev/test_kft1"

再展開:


2299:??? { fd1 = open("/dev/test_kft1",00); if(fd1 < 0) { printf("Open device error/n"); return 0; } };
2300:??? { fd2 = open(DEV_FILE_NAME2,00); if(fd2 < 0) { printf("Open device error/n"); return 0; } };
2301:??? { fd3 = open(DEV_FILE_NAME3,00); if(fd3 < 0) { printf("Open device error/n"); return 0; } };
2302:??? { fd4 = open(DEV_FILE_NAME4,00); if(fd4 < 0) { printf("Open device error/n"); return 0; } };
2303:??? { fd5 = open(DEV_FILE_NAME5,00); if(fd5 < 0) { printf("Open device error/n"); return 0; } };
2304:??? { fd6 = open(DEV_FILE_NAME6,00); if(fd6 < 0) { printf("Open device error/n"); return 0; } };

很顯然第一個符號被替換了, 因為是符號是宏的緣故。 這樣我們也能把這一擴展特性應(yīng)用在變量上。


總結(jié)

以上是生活随笔為你收集整理的关于gcc扩展中的宏定义中用 # 和 ##的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。