2015-09-26 54 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