使某些东西既是C标识符又是字符串?

时间:2020-03-06 14:39:07  来源:igfitidea点击:

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

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

解决方案

对于第二个#define,我们需要使用预处理程序运算符,如下所示:

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

将参数转换为字符串。

这是声明名称列表的好方法:

#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);

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