16

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

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 不允许您将参数放在字符串中?

4

2 回答 2

26

对于您的第二个#define,您需要使用 # 预处理器运算符,如下所示:

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

这会将参数转换为字符串。

于 2008-09-24T09:55:18.203 回答
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);

这样,此名称列表可以重复使用多次。我已经用它来制作新语言功能的原型,尽管从未最终使用它们。因此,如果不出意外,它们是在自己的发明中找到死胡同的好方法。我想知道是不是因为他们说:“宏不好”...... :)

于 2008-09-24T11:04:33.827 回答