【问题标题】:Is there something like nameof of C# in C for define directive?在 C 中是否有类似 C# 的名称用于定义指令?
【发布时间】:2019-08-28 16:01:15
【问题描述】:

我有经典

    #define SOME_CONSTANT value

有没有办法像 C# nameof(field) 一样获取字符串"SOME_CONSTANT"

编辑

我必须解析一个文件来寻找一些关键字:

#define KEY_A 1
#define KEY_B 2

int foo(char *s)
{
    if (strcmp(s, nameof(KEY_A)) == 0)
        return KEY_A;
    else if (strcmp(s, nameof(KEY_B)) == 0)
        return KEY_B;
    else
        return -1;
}

如果我调用 foo("KEY_A") 它应该返回 1

【问题讨论】:

  • #define SOME_CONSTANT_NAME "SOME_CONSTANT" 与您将要获得的距离差不多。
  • C# 有这个而 C 没有的原因是因为 C# 有 metadata, 而 C 没有。一旦你的程序被编译,常量的名字就消失了。
  • 考虑退后一步,就您想要实现的任何目标寻求帮助。我想我们可能正在研究一个 XY 问题。 meta.stackexchange.com/questions/66377/what-is-the-xy-problem 这没什么不好,这意味着实际上可能有一种很酷的简单方法可以实现您的实际目标。
  • 你可以#define NAMEOF(X) #X,然后NAMEOF(SOME_CONSTANT)会扩展为"SOME_CONSTANT"。我不确定这是否是你真正想要的。
  • ... 我的NAMEOF(X) 建议可能不是您想要的,因为它不可嵌套。所以在#define NAMEOF(X) #X#define FOO(X) X 之后,NAMEOF(FOO(SOME_CONSTANT)) 将扩展为"FOO(X)",这不太可能是你想要的。同样,在#define NAMEOF(X) #X#define XFOO(X) X#define FOO(X) XFOO(X) 之后,NAMEOF(FOO(SOME_CONSTANT)) 将扩展为"FOO(SOME_CONSTANT)",这可能会略有改进,但仍然不太可能是您想要的。

标签: c c-preprocessor nameof


【解决方案1】:

由于没有其他人发布答案...

@palmis,我认为这就是您正在寻求的解决方案。

#define NAMEOF(x) (#x)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多