中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > C/C++中宏定義的經(jīng)典運用

        C/C++中宏定義的經(jīng)典運用

        作者: 時間:2016-12-01 來源:網(wǎng)絡(luò) 收藏

        這種實現(xiàn)模型只是簡化的版本,STATE_TABLE(ENRTY)中的ENTRY可以定義多個參數(shù)如下所示:

        /*COMMANDS*/
        #define COMD1(a0,a1,a2,...,am) /*具體實現(xiàn)*/
        #define COMD2(a0,a1,a2,...,am) /*具體實現(xiàn)*/
        ...

        #define TABLE(ENTRY)
        ENTRY(a0,a1,a2,...,am)
        ENTRY(a0,a1,a2,...,am)
        ...
        ENTRY(a0,a1,a2,...,am)

        比如將上面的初始化實現(xiàn)修改為下面的形式,也就是多個參數(shù)的形式,實現(xiàn)如下:

        點擊(此處)折疊或打開

        typedef void(*p_func_t)(void);

        #define EXPAND_AS_ENUM(a,b,c) a,

        #define EXPAND_AS_JUMPTABLE(a,b,c) b,

        #define EXPAND_AS_FUNCDEC(a,b,c) void c(void);

        #define STATE_TABLE(ENTRY)
        ENTRY(STATE_0,func_0,func_0)
        ENTRY(STATE_1,func_1,func_1)
        ENTRY(STATE_2,func_2,func_2)
        ENTRY(STATE_3,func_3,func_3)
        ENTRY(STATE_4,func_4,func_4)


        enum{
        STATE_TABLE(EXPAND_AS_ENUM)
        NUM_STATES
        };

        STATE_TABLE(EXPAND_AS_FUNCDEC)

        p_func_t init_table[NUM_STATES] =
        {
        STATE_TABLE(EXPAND_AS_INITTABLE)
        };

        上面的實現(xiàn)并不是非常的恰當(dāng),因為第二個、第三個參數(shù)實質(zhì)上是一致的,沒有必要定義為三個參數(shù)。本文只是說明三個參數(shù)的實現(xiàn)情況。其他多個參數(shù)的實現(xiàn)情況類似。為了說明這種模型的可行性,我寫了簡單的測試代碼,由于各個模塊的初始化代碼需要程序員手動的實現(xiàn),因此可以定義在其他的位置,同時在宏定義中也已經(jīng)實現(xiàn)了各個函數(shù)的聲明問題,因為不會出現(xiàn)未定義的問題。具體的實現(xiàn)如下所示:

        #include

        typedef void(*p_func_t)(void);

        #define EXPAND_AS_ENUM(a,b) a,

        #define EXPAND_AS_INITTABLE(a,b) b,

        #define EXPAND_AS_FUNCDEC(a,b) void b(void);

        #define STATE_TABLE(ENTRY)
        ENTRY(STATE_0,func_0)
        ENTRY(STATE_1,func_1)
        ENTRY(STATE_2,func_2)
        ENTRY(STATE_3,func_3)
        ENTRY(STATE_4,func_4)


        enum{
        STATE_TABLE(EXPAND_AS_ENUM)
        NUM_STATES
        };

        STATE_TABLE(EXPAND_AS_FUNCDEC)

        p_func_t init_table[NUM_STATES] =
        {
        STATE_TABLE(EXPAND_AS_JUMPTABLE)
        };

        /*測試代碼*/
        int main()
        {
        int i = 0;

        for(i = 0; i < NUM_STATES; ++ i)
        (jumptable[i])();

        return 0;
        }

        /*各個模塊的初始化函數(shù)實現(xiàn)*/
        void func_0(void)
        {
        printf("In func_0");
        }

        void func_1(void)
        {
        printf("In func_1");
        }

        void func_2(void)
        {
        printf("In func_2");
        }

        void func_3(void)
        {
        printf("In func_3");
        }

        void func_4(void)
        {
        printf("In func_4");
        }

        關(guān)于多變量的情況,在Linux內(nèi)核源碼中的物理內(nèi)存與虛擬內(nèi)存之間可以采用這種方式實現(xiàn),在很多情況下都知道寄存器的物理內(nèi)存,一般一組相關(guān)的寄存器的映射方式都是相同的,采用這種宏定義的實現(xiàn)方式就能較好完成定義問題,當(dāng)然只是可行的方法而已。

        #define ADDRESS_OFFSET (0x8000)
        #define PHYS_ADDRESS(a,b,c) a=c;
        #define VIRU_ADDRESS(a,b,c) a = b + c;

        #define REGISTER_MAP(ENTRY)
        ENTRY(reg0,ADDRESS_OFFSET,0x10)
        ENTRY(reg1,ADDRESS_OFFSET,0x14)
        ENTRY(reg2,ADDRESS_OFFSET,0x18)
        ...
        ENTRY(regm,ADDRESS_OFFSET,0x2c)

        /*物理地址*/
        REGISTER_MAP(PHYS_ADDRESS)
        /*虛擬地址*/
        REGISTER_MAP(VIRU_ADDRESS)

        宏定義的這種實現(xiàn)方式在一些嵌入式系統(tǒng)中是非常有效的,掌握這種實現(xiàn)方法能夠較好的管理各個模塊、各種狀態(tài)下對應(yīng)的處理函數(shù)。這是一種經(jīng)典的用法。這實際上給出可一種解決問題的模型架構(gòu),掌握好這種方式能夠較好的實現(xiàn)模塊的管理問題。這種實現(xiàn)方法不僅代碼量少,而且能夠避免很多錯誤的產(chǎn)生,能夠快速的進行修改,但是難點在于代碼對于初學(xué)者有一定的難度,而且宏定義實現(xiàn)的函數(shù)還能夠采用其他的方法實現(xiàn),只是宏定義能夠較好的簡化代碼,使得代碼優(yōu)美且易維護。


        上一頁 1 2 下一頁

        關(guān)鍵詞: CC++宏定義經(jīng)典運

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉