如何将某个内容既作为C标识符又作为字符串?

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 不允许你在字符串中放置参数吗?
2个回答

28

对于你的第二个#define,你需要使用#预处理器运算符,像这样:

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

将参数转换为字符串。


4
这是一个好的声明名称列表的方式:
#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
很高兴看到其他人也在使用宏名称传递。我发现这个技术非常强大和有用。不要介意我自己宣传一下:https://dev59.com/-XVC5IYBdhLWcg3w51ry - Suma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接