我是这个论坛的新手,所以请放轻松我:)
我的代码中有以下内容
#define SYS_SBS 0x02
每当我尝试使用它并尝试输出时,我得到2作为值,但是我想让SYS_SBS作为我程序的输出。有办法,我可以这样做。
我无法控制源代码。我只需要输出SYS_SBS。
其他详细信息:我无法更改某些头文件。但是我可以在.cpp文件中更改主要功能。我希望SYS_SBS作为输出。我正在使用卫星和我的接收器检测到的所有卫星,我必须输出它们是什么类型的卫星。在代码中,所有这些都是用这个十六进制数定义的。我只想输出SYS_SBS而不是2
答案 0 :(得分:9)
#include <stdio.h>
#define SYS_SBS 0x02
#define id(x) #x
int main(){
printf("%s %d\n", id(SYS_SBS), SYS_SBS);
return 0;
}
答案 1 :(得分:3)
C标准提供stringification运算符(在令牌前添加#),允许您输出特定的令牌。
不可能的是从变量的值向后转换为此令牌名称,因为这在翻译过程中丢失(正如其他人所提到的)。如果您需要这种转换,请考虑一个显式的“value2str”函数,该函数返回给定值的字符串表示形式:
const char *myType2str(int value)
{
switch (value)
{
case SYS_SBS:
return "SYS_SBS";
default:
return "UNKNOWN VALUE";
}
}
编辑:根据一些评论,字符串化是标准的一部分。改变了。谢谢你的提示。没有意识到这一点。
答案 2 :(得分:2)
0x02
是 source 中的十六进制表示形式。一旦你编译它,它只是一个数字(2)。
如果你想把它打印成十六进制,那么,好吧......打印成十六进制(例如:使用格式化字符串 "0x%.2x"
)。
嗯,你可以简单地说:
printf("SYS_SBS");
但是我假设你有一个数字作为“输入”(如2),并且想要输出字符串SYS_SBS
,那是不可能的。您可以做的最好的事情是创建一个查找表,例如:
const char* sys_strings[] = { "SYS_EX", "SYS_TEM", "SYS_SBS" };