c - 有了#define 值替换列表,如何将值解析为标识符的字符串?

标签 c c-preprocessor

在调整一些给定的接口(interface)时,我遇到了扩展使用大量 #defines 的头文件的问题。

我的是这样的:

#define STATUS_OK      0x00
#define STATUS_FAIL    0x01
#define STATUS_WAIT    0x02
#define STATUS_ILLEGAL 0x03
#define STATUS_FULL    0x04
...

有很多这样的定义,我很高兴,因为我不必把它们都写出来。

但是,虽然我可以很好地将它们用于 switchif 和其他语句来替代 0x00 等等,但我现在想有相反的方向。

因此,有了 0x00,我想打印出标识符“STATUS_OK”。

据我所知,这是不可能的,但有什么好的解决方法可以让它成为可能?!是否可以像这样设置一个数组:

arrayNames[STATUS_OK] = _STATUS_OK_

STATUS_OK 将解析为 0x00_STATUS_OK_ 将解析为“STATUS_OK”?

此外,我正在寻找一种解决方案,它使用尽可能少的内存来执行此操作。

这就是我希望能够做到的:

prinf("%s",resolve(0x00));
-> "STATUS_OK"

我希望,我已经明确了我在寻找什么。

编辑:

感谢大家的快速有用的回复!我将使用 Larsmans 解决方案,并可能尝试将它与 qrdl 之一结合起来。可能需要一段时间,完成后我会替换此编辑。

最佳答案

您可以使用一些宏技巧和预处理器的 stringize 运算符来完成此操作。看一看:

#include <stdio.h>
#define STATUS_OK 0x05
#define STATUS_BAD 0x09
#define LOOKUP_CASE(x) case x: return #x

const char *lookup_name(int val) {
    switch(val) {
        LOOKUP_CASE(STATUS_OK);
        LOOKUP_CASE(STATUS_BAD);
        default: return "<UNDEFINED>";
    }
    return NULL;
}

int main(void) {
    printf("%s\n", lookup_name(STATUS_OK));
    printf("%s\n", lookup_name(STATUS_BAD));
    return 0;
}

除了 LOOKUP_CASE 宏之外,该示例是不言自明的。它使用 # 运算符生成与其操作数对应的字符串常量,让您避免重复 #define-d 常量的名称两次。

这是一个link to ideone有了这个工作示例。

关于c - 有了#define 值替换列表,如何将值解析为标识符的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13517118/

相关文章:

c - 如何使用 header 将多个 c 文件链接在一起?

c - 如何设置 make 来查找需要编译的自动生成文件的依赖关系

c - 我用 C 编写了一个简单的程序来计算数字的阶乘

java - C Socket - 无法重新连接服务器

c - 为什么这些构造使用前后递增的未定义行为?

使用 C 预处理器计算 8 位 CRC?

c - Union中如何共享内存

c++ - 字符串常量前的 Unqualified-id

c - 在 C 预处理器语句中添加零

c++ - 所有结构成员的预处理器批处理