C 打印与带变量的整数关联的宏标识符的名称
我找不到类似的东西C 打印与带变量的整数关联的宏标识符的名称,c,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); 我没有找到如何使用它来获得我想要的东西。没有直接的方法来做到这一点。printf调用中唯一的信息是变量x,它的当前值恰好是1(在运行时)
#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);
我没有找到如何使用它来获得我想要的东西。没有直接的方法来做到这一点。
printf
调用中唯一的信息是变量x
,它的当前值恰好是1
(在运行时),它恰好是名为ONE
的宏的展开。编译器无法从该信息中找出名称ONE
。可能有几个不同的宏具有相同的定义,也可能没有
如果要打印字符串ONE
给定整数值1
,则必须设置某种查找表或函数。例如:
const char *const names[] = { "ZERO", "ONE", "TWO", "THREE", "FOUR", /* etc. */ };
printf("%s\n", names[x]);
将完全由您来确定名称的正确性,因此,例如,
1
不会映射到“三”
没有直接的方法。printf
调用中唯一的信息是变量x
,它的当前值恰好是1
(在运行时),它恰好是名为ONE
的宏的展开。编译器无法从该信息中找出名称ONE
。可能有几个不同的宏具有相同的定义,也可能没有
如果要打印字符串ONE
给定整数值1
,则必须设置某种查找表或函数。例如:
const char *const names[] = { "ZERO", "ONE", "TWO", "THREE", "FOUR", /* etc. */ };
printf("%s\n", names[x]);
正确的名字完全取决于你,例如,
1
不会映射到“三个”
,正如@KeithThompson所说,没有简单的方法
但有一种方法或多或少满足了你的要求
#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;
}
#定义我的枚举列表\
X(一,1)\
X(二,二)\
X(三,三)
#定义X(名称、值)名称=值,
enum MyEnum{MY_enum_LIST};
#未定义X
const char*my_enum_to_str(enum MyEnum e)
{
开关(e)
{
#定义X(名称、值)大小写值:返回#名称;
我的枚举列表
#未定义X
违约:
返回“”;
}
}
int main()
{
int x=一;
printf(“%d\n”,x);//打印“1”
printf(“%s\n”,my_enum_to_str(x));//打印“一”
返回0;
}
与原始的查找表相比,它有以下优点:
- 无需重复枚举器名称两次
- 您可以有任何枚举数值,而不仅仅是一个连续的范围
- 不能意外地为枚举数指定错误的名称
#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;
}
#定义我的枚举列表\
X(一,1)\
X(二,二)\
X(三,三)
#定义X(名称、值)名称=值,
enum MyEnum{MY_enum_LIST};
#未定义X
const char*my_enum_to_str(enum MyEnum e)
{
开关(e)
{
#定义X(名称、值)大小写值:返回#名称;
我的枚举列表
#未定义X
违约:
返回“”;
}
}
int main()
{
int x=一;
printf(“%d\n”,x);//打印“1”
printf(“%s\n”,my_enum_to_str(x));//打印“一”
返回0;
}
与原始的查找表相比,它有以下优点:
- 无需重复枚举器名称两次
- 您可以有任何枚举数值,而不仅仅是一个连续的范围
- 不能意外地为枚举数指定错误的名称
printf
的文档怎么样?如果这没有帮助,也许你错过了一些基本的语言。上面的代码调用了未定义的行为,iow:这是无效的C。//例外的输出将是“一”
您确定吗?你试过了吗?你想要intx=ONE+ONE代码>?@Nati.E:正如我所想:你错过了C语言和编程的基本知识。宏ONE
和int
变量之间没有连接。无意冒犯。但是请买一本关于编程的书,一般来说是C语言的,你不是把一定义为1吗?所以你可以说x=1;这和你现在正在做的是一样的?你想完成什么?阅读printf
的文档怎么样?如果这没有帮助,也许你错过了一些基本的语言。上面的代码调用了未定义的行为,iow:这是无效的C。//例外的输出将是“一”
您确定吗?你试过了吗?你想要intx=ONE+ONE代码>?@Nati.E:正如我所想:你错过了C语言和编程的基本知识。宏ONE
和int
变量之间没有连接。无意冒犯。但是请买一本关于一般编程和C语言编程的书。谢谢,很好的解决方案!!但这让我工作很努力。@HolyBlackCat的答案对我来说更好。非常感谢。我也会将数组设置为const
。谢谢,非常好的解决方案!!但这让我工作很努力。@HolyBlackCat的答案对我来说更好。非常感谢。我也会将数组设置为常量。这是一种糟糕的方法。@Olaf请详细说明。说“糟糕的方法”根本没有建设性。好吧,这是目前最好的解决方案。唯一的替代方法是简单的查找表(需要重复枚举数名称,通常会导致错误)和在运行时按名称查找枚举数值,这显然很慢。这种方法唯一的缺点是语法非常奇特。@HolyBlackCat:调试和维护是两个方面。@Olaf我的观点是,任何其他解决方案(除了代码生成之外,这将很好地工作)都需要一个