【问题标题】:Making something both a C identifier and a string?将某些东西同时作为 C 标识符和字符串?
【发布时间】:2026-01-21 19:05:01
【问题描述】:

假设你想生成一个匹配的标识符和字符串列表

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

【问题讨论】:

    标签: c c-preprocessor preprocessor-directive


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 很高兴看到其他人也在使用宏名称传递。我发现这种技术非常强大和有用。无耻塞:*.com/questions/147267/…