我可以在C中打印#defines给出它们的值吗?

时间:2012-09-20 08:43:52

标签: c

我有

#define ADD 5
#define SUB 6

我可以根据值5和6打印ADD和SUB吗?

3 个答案:

答案 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);
}