打印与变量相关的宏标识符的名称

时间:2017-04-18 18:38:29

标签: c

我找不到类似的东西。

#define ONE 1
#define TWO 2

int main()
{
   int x = ONE;
   printf("%s \n", x);
}
//the desirable output will be "ONE"

现在,我用

看到了其他答案
#define PRINT(X) printf("%s \n", #x);

我没有找到如何使用它来获得我想要的东西。

2 个答案:

答案 0 :(得分:5)

没有直接的方法可以做到这一点。您printf调用中的唯一信息是变量x,其当前值恰好是1(在运行时),这恰好是名称为宏的宏的扩展ONE。编译器无法从该信息中找出名称ONE。可能有几个具有相同定义的不同宏,或者可能没有任何宏。

如果要在给定整数值ONE的情况下打印字符串1,则必须设置某种查找表或函数。例如:

const char *const names[] = { "ZERO", "ONE", "TWO", "THREE", "FOUR", /* etc. */ };
printf("%s\n", names[x]);

完全取决于你的名字是否合适,例如1没有映射到"THREE"

答案 1 :(得分:0)

正如@KeithThompson所说,没有简单的方法。

但是有clever hack或多或少的要求。

#define MY_ENUM_LIST \
    X( ONE   , 1 ) \
    X( TWO   , 2 ) \
    X( THREE , 3 )

#define X(name, value) name = value,
enum MyEnum {MY_ENUM_LIST};
#undef X

const char *my_enum_to_str(enum MyEnum e)
{
    switch (e)
    {
        #define X(name, value) case value: return #name;
        MY_ENUM_LIST
        #undef X
      default:
        return "<invalid>";
    }
}

int main()
{
    int x = ONE;
    printf("%d\n", x); // prints "1"
    printf("%s\n", my_enum_to_str(x)); // prints "ONE"

    return 0;
}

与天真的查找表相比,它具有以下优势:

  • 无需重复两次枚举器名称。
  • 您可以拥有任何枚举值,而不仅仅是连续的范围。
  • 您不能意外地为枚举器指定错误的名称。