久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > C/C++中宏定義的經典運用

C/C++中宏定義的經典運用

作者: 時間:2016-12-01 來源:網絡 收藏

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

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

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

比如將上面的初始化實現修改為下面的形式,也就是多個參數的形式,實現如下:

點擊(此處)折疊或打開

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

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

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

/*各個模塊的初始化函數實現*/
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");
}

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

#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)

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


上一頁 1 2 下一頁

評論


相關推薦

技術專區

關閉