2015-09-26 87 views
1

我需要寫功能就像這樣:宏內部枚舉C++

void foo() 
{ 
    //some details 
} 
enum fun_names 
{ 
    fun_name_foo, 
}; 

所以我做了2個宏:

#define MAKE_FUN(fun) void fun(){} 
#define ADD_FUN(fun) fun_name_##fun, 

然後使用它們像這樣:

MAKE_FUN(foo) 
MAKE_FUN(bar) 
enum fun_names 
{ 
    ADD_FUN(foo) 
    ADD_FUN(bar) 
}; 

但作爲你可以看到,我使用完全相同的參數重複2個宏。是否有可能使這樣一個單一的宏?

CREATE_FUN(foo) 
CREATE_FUN(bar) 

這節省了代碼行並且不易出錯。

+0

爲什麼不直接命名枚舉值? 'fun_name_foo'難以輸入比'ADD_FUN(foo)'? –

+0

@JonathanPotter,通過這樣做,我可以定義函數並將其添加到枚舉中,只需要1行? – Immueggpain

回答

2

可能的伎倆可能是有一個宏以宏名作爲參數

#define DO_ENUM(Mac) \ 
    Mac(foo) \ 
    Mac(bar) 

然後

#define DECLARE_ENUM(X) X, 
enum fun_names { 
    Nothing, 
    DO_ENUM(DECLARE_ENUM) 
}; 
#undef DECLARE_ENUM 

並申報功能:

#define DECLARE_FUN(X) void myfun_##X(void); 
DO_ENUM(DECLARE_FUN) 
#undef DECLARE_FUN 

等。

另一種方式可能是生成一些專門的頭文件,例如,使用一些awk腳本,從另一個包含函數列表的文件等。

+0

定義枚舉宏以枚舉其他宏?好戲!嗯......我必須在'DO_ENUM'宏中添加新函數,它必須放在'DECLARE_ENUM'和'DECLARE_FUN'之前?這可能是一個問題......並且'DECLARE_ENUM'' DECLARE_FUN'必須做成相同的格式,但這不是一個真正的問題。 – Immueggpain