我找不到类似的东西。
#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);
我没有找到如何使用它来获得我想要的东西。
答案 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;
}
与天真的查找表相比,它具有以下优势: