在调整一些给定的接口(interface)时,我遇到了扩展使用大量 #defines
的头文件的问题。
我的是这样的:
#define STATUS_OK 0x00
#define STATUS_FAIL 0x01
#define STATUS_WAIT 0x02
#define STATUS_ILLEGAL 0x03
#define STATUS_FULL 0x04
...
有很多这样的定义,我很高兴,因为我不必把它们都写出来。
但是,虽然我可以很好地将它们用于 switch
、if
和其他语句来替代 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/