欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言基本概念宏定義中的#和##教程

 更新時(shí)間:2023年04月28日 11:15:07   作者:lhw  
這篇文章主要為大家介紹了C語(yǔ)言基本概念宏定義中的#和##教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

#和##是宏定義中常用的兩個(gè)預(yù)處理運(yùn)算符

其中#用于記號(hào)串化,##用于記號(hào)黏結(jié),下面分別介紹它們。

1. 記號(hào)串化(#)

記號(hào)串化可以將函數(shù)式宏定義中的實(shí)參轉(zhuǎn)換為字符串。在函數(shù)式宏定義中,如果替換列表中有“#”,則其后的預(yù)處理記號(hào)必須是當(dāng)前宏的形參。在預(yù)處理期間,“#”連同它后面的形參一起被實(shí)參取代。例如

#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;
}

程序運(yùn)行結(jié)果如下:

第1次調(diào)用宏時(shí),用"y"替換#x。第2次調(diào)用宏時(shí),用"2 + 4"替換#x。第3次調(diào)用宏時(shí),用"3 * 2"替換#x。

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

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

然后,字符串串聯(lián)功能將這3個(gè)相鄰的字符串組合成一個(gè)字符串:

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

如果傳入的實(shí)參中間有空白,則不管有多少,都被轉(zhuǎn)換為一個(gè)空格,參數(shù)開頭和末尾的空白都被刪除。例如第3次調(diào)用宏時(shí),實(shí)參“3   *   2  ”轉(zhuǎn)換為“3 * 2”。

2. 記號(hào)黏結(jié)(##)

與#運(yùn)算符類似,##運(yùn)算符可用于函數(shù)式宏的替換部分,它把兩個(gè)記號(hào)組合成一個(gè)記號(hào)。例如,可以這樣定義函數(shù)式宏:

#define XNAME(n) x ## n

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

記號(hào)黏結(jié)的作用是將幾個(gè)預(yù)處理記號(hào)合并為一個(gè)。在一個(gè)函數(shù)式宏定義中,如果一個(gè)預(yù)處理記號(hào)的前面或者后面有"##",則該記號(hào)將與它前面或者后面的記號(hào)合并,如果該預(yù)處理記號(hào)是宏的形參,則用實(shí)參執(zhí)行合并。例如:

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

第2行的宏調(diào)用,其擴(kuò)展之后如下:

char abr;

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

#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; // 轉(zhuǎn)換為 x1 = 14;
     int XNAME(2) = 20; // 轉(zhuǎn)換為 int x2 = 20;
     int x3 = 30;
     PRINT_XN(1); // 轉(zhuǎn)換為 printf("x1 = %d\n", x1);
     PRINT_XN(2); // 轉(zhuǎn)換為 printf("x2 = %d\n", x2);
     PRINT_XN(3); // 轉(zhuǎn)換為 printf("x3 = %d\n", x3);
     return 0;
}

程序運(yùn)行結(jié)果如下。

3. 分析下列程序運(yùn)行結(jié)果

#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;
}

析:

宏展開順序大致可以歸結(jié)為:

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

第二步:如果實(shí)參也是宏,則展開實(shí)參

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

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

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

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

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

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

上面程序運(yùn)行結(jié)果如下。

以上就是C語(yǔ)言基本概念宏定義中的#和##教程的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言宏定義#和##的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 深入探究C語(yǔ)言中的二叉樹

    深入探究C語(yǔ)言中的二叉樹

    樹是一種非線性的數(shù)據(jù)結(jié)構(gòu),它是由n(n>=0)個(gè)有限結(jié)點(diǎn)組成一個(gè)具有層次關(guān)系的集合。把它叫做樹是因 為它看起來(lái)像一棵倒掛的樹,也就是說(shuō)它是根朝上,而葉朝下的。本文將帶你深入探究C語(yǔ)言中的二叉樹,感興趣的同學(xué)跟著小編一起學(xué)習(xí)吧
    2023-05-05
  • 詳解C++中inline關(guān)鍵字的作用

    詳解C++中inline關(guān)鍵字的作用

    這篇文章主要為大家介紹了C++中的inline關(guān)鍵字,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • 利用C語(yǔ)言實(shí)現(xiàn)掃雷游戲

    利用C語(yǔ)言實(shí)現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了利用C語(yǔ)言實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 詳解C++ 拷貝構(gòu)造函數(shù)和賦值運(yùn)算符

    詳解C++ 拷貝構(gòu)造函數(shù)和賦值運(yùn)算符

    本文主要介紹了拷貝構(gòu)造函數(shù)和賦值運(yùn)算符的區(qū)別,以及在什么時(shí)候調(diào)用拷貝構(gòu)造函數(shù)、什么情況下調(diào)用賦值運(yùn)算符。最后,簡(jiǎn)單的分析了下深拷貝和淺拷貝的問(wèn)題。有需要的朋友可以看下
    2016-12-12
  • C++超詳細(xì)分析講解內(nèi)聯(lián)函數(shù)

    C++超詳細(xì)分析講解內(nèi)聯(lián)函數(shù)

    為了消除函數(shù)調(diào)用的時(shí)空開銷,C++ 提供一種提高效率的方法,即在編譯時(shí)將函數(shù)調(diào)用處用函數(shù)體替換,類似于C語(yǔ)言中的宏展開。這種在函數(shù)調(diào)用處直接嵌入函數(shù)體的函數(shù)稱為內(nèi)聯(lián)函數(shù)(Inline Function),又稱內(nèi)嵌函數(shù)或者內(nèi)置函數(shù)
    2022-06-06
  • C語(yǔ)言學(xué)生管理系統(tǒng)源碼分享

    C語(yǔ)言學(xué)生管理系統(tǒng)源碼分享

    這篇文章主要為大家分享了C語(yǔ)言學(xué)生管理系統(tǒng)的源碼,幫助大家學(xué)習(xí)結(jié)構(gòu)體,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 4組C語(yǔ)言中順序讀寫文件的函數(shù)分享

    4組C語(yǔ)言中順序讀寫文件的函數(shù)分享

    這篇文章主要為大家詳細(xì)介紹了4組C語(yǔ)言中實(shí)現(xiàn)順序讀寫文件的函數(shù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • C++詳細(xì)講解圖論的基礎(chǔ)與圖的儲(chǔ)存

    C++詳細(xì)講解圖論的基礎(chǔ)與圖的儲(chǔ)存

    圖論〔Graph?Theory〕是數(shù)學(xué)的一個(gè)分支。它以圖為研究對(duì)象。圖論中的圖是由若干給定的點(diǎn)及連接兩點(diǎn)的線所構(gòu)成的圖形,這種圖形通常用來(lái)描述某些事物之間的某種特定關(guān)系,用點(diǎn)代表事物,用連接兩點(diǎn)的線表示相應(yīng)兩個(gè)事物間具有這種關(guān)系
    2022-05-05
  • 教你用Matlab制作立體動(dòng)態(tài)相冊(cè)

    教你用Matlab制作立體動(dòng)態(tài)相冊(cè)

    沒想到吧,MATLAB竟也能制作3D相冊(cè)!本文將為大家詳細(xì)介紹Matlab制作立體動(dòng)態(tài)相冊(cè)的方法步驟,感興趣的小伙伴可以跟隨小編一起動(dòng)手試一試
    2022-03-03
  • 全排列算法的原理和實(shí)現(xiàn)代碼

    全排列算法的原理和實(shí)現(xiàn)代碼

    這篇文章主要介紹了全排列算法的原理和實(shí)現(xiàn)代碼,全排列是將一組數(shù)按一定順序進(jìn)行排列,如果這組數(shù)有n個(gè),那么全排列數(shù)為n!個(gè),需要的朋友可以參考下
    2014-08-08

最新評(píng)論