2010-11-01 48 views
1

我有一些現有的代碼使用enum而不是回調函數指針。該回調使用表格調用:callback_table[enum]在C預處理器中重命名變量

枚舉以enum_ prefix命名,相應的函數以func_ prefix命名。

因此,涉及回調函數調用是這樣的:

foo (param, enum_name); 

在瀏覽代碼,我取的名字部分和前綴func_,而不是僅僅做一個「跳轉到」。

我想有一個宏,使我的代碼如下所示:

foo (param, f2e(func_name)); 

,這樣我可以保持現有的代碼不變,仍然能夠做一個「跳轉到」。

是否有可能有這樣一個宏?最簡單的解決方案是省略func_這意味着f2e簡單附加enum_ prefix,但我更喜歡解決方案,我仍然可以有func_。這可能嗎?

回答

1

這是一個有點迂迴的,但你可以做這樣的事情:

(讓我們假設,在這個例子的目的,你有三種可能的枚舉值enum_oneenum_twoenum_three)。

#define enum_func_one enum_one 
#define enum_func_two enum_two 
#define enum_func_three enum_three 

#define f2e(func_name) enum_ ## func_name 

(當然)的缺點是,你需要一個特殊的#define爲你的枚舉的每個可能值。


替代

作爲替代方案,如果你唯一需要的是有函數名得心應手,所以你可以使用IDE的「跳轉到」功能...你可以做這樣的事情這樣的:

#define f2e(name, func_name) enum_ ## name 

然後你的電話是這樣的:

foo (param, f2e(one, func_one)); 

也許有點多餘,但它會以最小的入侵代碼來完成你的目標。