我有
#define ADD 5
#define SUB 6
我可以根据值5和6打印ADD和SUB吗?
答案 0 :(得分:4)
没有
预处理器删除了define
d个符号的名称,因此编译器永远不会看到它们。
如果这些名称在运行时很重要,则需要将它们编码为比预处理程序符号名称更持久的名称。也许是一个包含字符串和整数的表:
#define DEFINE_OP(n) { #n, n }
static const struct {
const char *name;
int value;
} operators[] = {
DEFINE_OP(ADD),
DEFINE_OP(SUB),
};
这使用字符串化预处理器运算符#
来避免重复。
通过上述内容,您可以轻松编写查找代码:
const char * op_to_name(int op)
{
size_t i;
for(i = 0; i < sizeof operators / sizeof *operators; ++i)
if(operators[i].value == op)
return operators[i].name;
return NULL;
}
答案 1 :(得分:1)
printf("%d", ADD);
它将打印5
你要记住的事情定义是:
在编译之前,预处理器将定义替换为源代码,因此代码中的所有ADD实例都被替换为5.在预处理器之后,printf如下所示:
printf("%d", 5);
所以回答你的问题:
不,你不能那样做。
答案 2 :(得分:0)
是的,但不是通过一些反向查找机制,其中值5
在某种程度上是字符串"ADD"
的符号。通过#define
定义的符号被预处理器正式替换。但是你可以保持简单:
const char *get_name(int value) {
switch(value) {
case ADD:
return "ADD";
case SUB:
return "SUB";
default:
return "WHATEVER";
}
}
#include <stdio.h>
int main() {
printf("%s = %d\n", get_name(ADD), ADD);
printf("%s = %d", get_name(SUB), SUB);
}