【发布时间】: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