制作C标识符和字符串?

时间:2008-09-24 09:52:32

标签: c c-preprocessor preprocessor-directive

假设您要生成标识符和字符串的匹配列表

enum
{
NAME_ONE,
NAME_TWO,
NAME_THREE
};

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

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

初步猜测:

您可以添加包含

的#include文件
myDefine(NAME_ONE)
myDefine(NAME_TWO)
myDefine(NAME_THREE)

然后使用它两次:

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

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

但#define不允许您将参数放在字符串中吗?

2 个答案:

答案 0 :(得分:25)

对于你的第二个#define,你需要使用#preprocessor运算符,如下所示:

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

将参数转换为字符串。

答案 1 :(得分: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);

这样,这个名单可以多次重复使用。我已经将它用于原型化新语言功能,尽管从未使用它们。所以,如果不出意外,它们是在自己的发明中找到死胡同的好方法。我想知道是不是因为他们说的话:“宏很糟糕”...... :)