中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言宏定義中的#和##是什么

發布時間:2023-04-28 14:34:52 來源:億速云 閱讀:99 作者:iii 欄目:開發技術

這篇文章主要講解了“C語言宏定義中的#和##是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C語言宏定義中的#和##是什么”吧!

#和##是宏定義中常用的兩個預處理運算符

1. 記號串化(#)

記號串化可以將函數式宏定義中的實參轉換為字符串。在函數式宏定義中,如果替換列表中有“#”,則其后的預處理記號必須是當前宏的形參。在預處理期間,“#”連同它后面的形參一起被實參取代。例如

#include <stdio.h>
#define PSQR(x) printf("The square of " #x " is %d.\n",((x)*(x)))
int main(void)
{
    int y = 5;
    PSQR(y);
    PSQR(2 + 4);
    PSQR( 3   *   2  );
    return 0;
}

程序運行結果如下:

C語言宏定義中的#和##是什么

第1次調用宏時,用"y"替換#x。第2次調用宏時,用"2 + 4"替換#x。第3次調用宏時,用"3 * 2"替換#x。

ANSI C字符串的串聯特性將這些字符串與printf()語句的其他字符串組合,生成最終的字符串。例如,第1次調用變成:

printf("The square of " "y" " is %d.\n",((y)*(y)));

然后,字符串串聯功能將這3個相鄰的字符串組合成一個字符串:

"The square of y is %d.\n"

如果傳入的實參中間有空白,則不管有多少,都被轉換為一個空格,參數開頭和末尾的空白都被刪除。例如第3次調用宏時,實參“3   *   2  ”轉換為“3 * 2”。

2. 記號黏結(##)

與#運算符類似,##運算符可用于函數式宏的替換部分,它把兩個記號組合成一個記號。例如,可以這樣定義函數式宏:

#define XNAME(n) x ## n

然后,展開宏XNAME(4)為x4。

記號黏結的作用是將幾個預處理記號合并為一個。在一個函數式宏定義中,如果一個預處理記號的前面或者后面有"##",則該記號將與它前面或者后面的記號合并,如果該預處理記號是宏的形參,則用實參執行合并。例如:

#define F(x, y, z)   x##y##r
char F(a, b, c);

第2行的宏調用,其擴展之后如下:

char abr;

需要注意的是,在函數式宏定義中,“##”不能位于替換列表的開頭和結尾。

#include <stdio.h>
#define XNAME(n) x ## n
#define PRINT_XN(n) printf("x" #n " = %d\n", x ## n);
int main(void)
{
     int XNAME(1) = 14; // 轉換為 x1 = 14;
     int XNAME(2) = 20; // 轉換為 int x2 = 20;
     int x3 = 30;
     PRINT_XN(1); // 轉換為 printf("x1 = %d\n", x1);
     PRINT_XN(2); // 轉換為 printf("x2 = %d\n", x2);
     PRINT_XN(3); // 轉換為 printf("x3 = %d\n", x3);
     return 0;
}

程序運行結果如下。

C語言宏定義中的#和##是什么

3. 分析下列程序運行結果

#include <stdio.h>
#define f(a,b) a##b
#define g(a)   #a
#define h(a) g(a)
int main()
{
    printf("h(f(1,2))展開為:%s\n",h(f(1,2)));
    printf("g(f(1,2))展開為:%s\n",g(f(1,2)));
    return 0;
}

析:

宏展開順序大致可以歸結為:

第一步:首先用實參代替形參,將實參代入宏文本中

第二步:如果實參也是宏,則展開實參

第三步:最后繼續處理宏替換后的宏文本,如果仍包含宏,則繼續展開

注意:如果在第二步,實參代入宏文本后,實參之前或之后遇到#或##,實參不再展開

根據以上宏展開步驟分析第8行的宏調用h(f(1,2)),其展開步驟為:

h(f(1,2))-->g(f(1,2))-->g(1##2)-->g(12)-->"12"

第9行的宏調用g(f(1,2)),其展開步驟為:

g(f(1,2))-->#f(1,2)-->"f(1,2)"

上面程序運行結果如下。

C語言宏定義中的#和##是什么

感謝各位的閱讀,以上就是“C語言宏定義中的#和##是什么”的內容了,經過本文的學習后,相信大家對C語言宏定義中的#和##是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东兴市| 师宗县| 荣成市| 保康县| 清原| 尉犁县| 旬邑县| 舟曲县| 锦屏县| 凯里市| 郸城县| 天镇县| 科尔| 邹城市| 遂昌县| 天峻县| 建湖县| 沧源| 巢湖市| 成都市| 和田市| 阿拉善右旗| 赞皇县| 谷城县| 柘荣县| 万安县| 金乡县| 洛川县| 丹棱县| 始兴县| 宁津县| 松江区| 陇西县| 澄江县| 广饶县| 苍南县| 曲周县| 南澳县| 岱山县| 横山县| 巴林左旗|