今天測試了宏定義中的 "#" 和 "##" 的區別。
結果如下:
"#" 代表和一個字符串相連接
"##" 代表和一個符號連接,符號可以是變量,或另一個宏符號。
舉例如下:
宏定義如下
(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; /
??? }?? /
}
如此調用:
??? 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; /
??? }?? /
}
調用方式相同。
看宏展開:
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; } };
現在看清楚了, ##n 的作用是把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; } };
很顯然第一個符號被替換了, 因為是符號是宏的緣故。 這樣我們也能把這一擴展特性應用在變量上。