#宏定義##

來源:互聯網
上載者:User

標籤:http   檔案   io   .net   har   rom   

from:http://bbs.csdn.net/topics/390821311

#與##在宏定義中的--宏展開
#include <stdio.h>
#define f(a,b) a##b
#define g(a)   #a
#define h(a) g(a)
int main()
{
        printf("%s\n", h(f(1,2)));   // 12
        printf("%s\n", g(f(1,2))); // f(1,2)
        return 0;
}
宏展開時:
如果宏定義以#開頭,不展開參數,直接替換。
故g(f(1,2))--->#f(1,2)--->"f(1,2)";
如果宏定義不以#開頭,展開參數,直接替換,由外層向裡層,如果碰到的是#開頭的宏,不繼續往裡層展開,往外層展開。
由外層向裡層,如果碰到的是以非#開頭的宏,繼續往裡層走,直至最裡層,開始一層層往外層展開。
故h(f(1,2))--->h(12)--->g(12)---->#12----->"12"。
PS:
##在宏中定義,是字元串連符
如a##b##c 等同於 "abc"
#在宏開頭出現,是表示宏展開的方式不同
#a 等同於"a"
#abc 等同於 "abc"
複雜的:
#include <stdio.h>
#define f(a,b) a##b
#define g(a)   #a
#define h(a) g(a)
int main()
{
        char a = ‘a‘;
        cout<<g(a)<<endl; // a
        cout<<g(g(a))<<endl; // a
        printf("%s\n", h(f(1,2)));   // 12
        printf("%s\n", g(f(1,2))); // f(1,2)
        printf("%s\n", g(h(f(1,2)))); // h(f(1,2))
        printf("%s\n", h(g(f(1,2)))); // "f(1,2)"
        printf("%s\n", h(h(f(1,2)))); // "12"
        system("pause");
        return 0;
}
預先處理後的:(在編譯選項中添加/EP /P後編譯產生的.i檔案。gcc加-E)
int main()
{
        char a = ‘a‘;
        cout<<"a"<<endl;
        cout<<"g(a)"<<endl;
        printf("%s\n", "12");
        printf("%s\n", "f(1,2)");
        printf("%s\n", "h(f(1,2))");
        printf("%s\n", "\"f(1,2)\"");
        printf("%s\n", "\"12\"");
        system("pause");
        return 0;
}
---------------------------------------------------
宏解析
1.       ##操作符
##操作符它的作用是在替代表中將其前後的參數串連成為一個預先處理符號,它不能出現於宏替代表的開端和末尾。
例:
#define concat(s,t) s##t
#define AAA ABC
concat(A, AA)
將被替換成
ABC
2.       重新掃描和替換
在其他清單中的所有參數替換過之後,前置處理器將對結果token序列重新掃描以便對其中的宏再次替換。
當正在替換的宏在其其他清單中發現自身時,就不再對其進行替換。在任何正在嵌套替換的宏的替換過程中遇到正被替換的宏就對其不再進行替換(防止遞迴)。
例:
#define ROOT AAA CCC
#define AAA ROOT
ROOT
將被替換成
ROOT CCC

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.