2008-09-24 64 views
14

说你想生成标识符和字符串制作C标识符和字符串?

enum 
{ 
NAME_ONE, 
NAME_TWO, 
NAME_THREE 
}; 

myFunction(NAME_ONE, "NAME_ONE"); 
myFunction(NAME_TWO, "NAME_TWO"); 
myFunction(NAME_THREE, "NAME_THREE"); 

..无重复自己,而不会自动生成代码,使用C/C++宏

初始猜测的匹配名单:

您可以添加含

myDefine(NAME_ONE) 
myDefine(NAME_TWO) 
myDefine(NAME_THREE) 

然后使用#include文件它有两次像:

#define myDefine(a) a, 
enum { 
#include "definitions" 
} 
#undef myDefine 

#define myDefine(a) myFunc(a, "a"); 
#include "definitions" 
#undef myDefine 

但#define不让你把参数放入一个字符串?

回答

24

关于你的第二的#define,你需要使用#预处理程序操作,例如:

#define myDefine(a) myFunc(a, #a); 

这将参数转换为字符串。

3

这里的声明名表的好方法:

#define FOR_ALL_FUNCTIONS(F)\ 
    F(NameOne)\ 
    F(NameTwo)\ 
    F(NameThree)\ 

#define DECLARE_FUNCTION(N)\ 
    void N(); 

#define IMPLEMENT_FUNCTION(N)\ 
    void N(){} 

FOR_ALL_FUNCTIONS(DECLARE_FUNCTION); 
FOR_ALL_FUNCTIONS(IMPLEMENT_FUNCTION); 

这样,这个名字的列表可以被重复使用多次。我用它来创建新的语言功能,尽管从未结束使用它们。所以,如果没有别的办法,他们是在自己的发明中找到死胡同的好方法。我不知道是不是因为他们说什么:“宏是坏的”... :)

+1

很高兴看到别人正在使用宏名传递。我发现这种技术非常强大和有用。无耻的插件:http://stackoverflow.com/questions/147267/easy-way-to-use-variables-of-enum-types-as-string-in-c#202511 – Suma 2008-10-14 19:41:27