在宏定義中,有時還會用到#
和##
兩個符號,它們能夠對宏參數進行操作。
# 的用法
#
用來將宏參數轉換為字符串,也就是在宏參數的開頭和末尾添加引號。例如有如下宏定義:
#define STR(s) #s
那么:
printf("%s", STR(c.biancheng.net)); printf("%s", STR("c.biancheng.net"));
分別被展開為:
printf("%s", "c.biancheng.net"); printf("%s", "\"c.biancheng.net\"");
可以發現,即使給宏參數“傳遞”的數據中包含引號,使用#
仍然會在兩頭添加新的引號,而原來的引號會被轉義。
將上面的例子補充完整:
- #include <stdio.h>
- #define STR(s) #s
- int main() {
- printf("%s\n", STR(c.biancheng.net));
- printf("%s\n", STR("c.biancheng.net"));
- return 0;
- }
運行結果:
c.biancheng.net
"c.biancheng.net"
##的用法
##
稱為連接符,用來將宏參數或其他的串連接起來。例如有如下的宏定義:
#define CON1(a, b) a##e##b #define CON2(a, b) a##b##00
那么:
printf("%f\n", CON1(8.5, 2)); printf("%d\n", CON2(12, 34));
將被展開為:
printf("%f\n", 8.5e2); printf("%d\n", 123400);
將上面的例子補充完整:
- #include <stdio.h>
- #define CON1(a, b) a##e##b
- #define CON2(a, b) a##b##00
- int main() {
- printf("%f\n", CON1(8.5, 2));
- printf("%d\n", CON2(12, 34));
- return 0;
- }
運行結果:
850.000000
123400