C++ 如何输出#定义值

C++ 如何输出#定义值,c++,c,C++,C,我是这个论坛的新手,所以请对我放松:) 我的代码中有以下内容 #define SYS_SBS 0x02 每当我尝试使用它并尝试输出时,我得到2作为值,但是我想得到SYS_SBS作为我程序的输出。有没有办法,我能做到 我无法控制源代码。我只需要输出SYS_SBS 其他详细信息:我无法更改某些头文件。但是,我可以更改.cpp文件中的主函数。我想要SYS_SBS作为输出。我与卫星一起工作,对于我的接收器检测到的所有卫星,我必须输出它们是什么类型的卫星。在代码中,它们都是用这个十六进制数定义

我是这个论坛的新手,所以请对我放松:)

我的代码中有以下内容

#define SYS_SBS     0x02 
每当我尝试使用它并尝试输出时,我得到2作为值,但是我想得到SYS_SBS作为我程序的输出。有没有办法,我能做到

我无法控制源代码。我只需要输出SYS_SBS

其他详细信息:我无法更改某些头文件。但是,我可以更改.cpp文件中的主函数。我想要SYS_SBS作为输出。我与卫星一起工作,对于我的接收器检测到的所有卫星,我必须输出它们是什么类型的卫星。在代码中,它们都是用这个十六进制数定义的。我只想输出SYS_SBS,而不是源代码中的十六进制表示形式为2。一旦你编译了它,它只是一个数字(2)

如果你想把它打印成十六进制,那么。。。将其打印为十六进制(例如:使用格式化字符串
“0x%.2x”

好吧,你可以简单地:

printf("SYS_SBS");
但是我假设您有一个数字作为“输入”(比如2),并且想要输出字符串
SYS\u SBS
,这是不可能的。您最好创建一个查找表,例如:

const char* sys_strings[] = { "SYS_EX", "SYS_TEM", "SYS_SBS" };
#包括
#定义SYS_SBS 0x02
#定义id(x)#x
int main(){
printf(“%s%d\n”,id(SYS\u SBS),SYS\u SBS);
返回0;
}
C标准提供了一个运算符(在令牌前面添加一个#),允许您输出特定令牌

不可能的是将变量的值向后转换为该标记名,因为这在转换过程中丢失(如其他人所述)。如果需要这种转换,请考虑一个显式的“value2str”函数,该函数返回给定值的字符串表示形式:

const char *myType2str(int value)
{
    switch (value)
    {
        case SYS_SBS:
            return "SYS_SBS";

        default:
            return "UNKNOWN VALUE";
    }
}

编辑:根据一些评论,严格化是标准的一部分。改变了。谢谢你的提示。我不知道。

我认为你不能,因为预处理器用值替换所有的SYS\u SBS如果你想
SYS\u SBS
作为输出,只输出
SYS\u SBS
听起来像个XY问题。你到底想做什么?@BartFriederichs我无法更改源代码。我想要SYS_SBS作为输出。我与卫星一起工作,对于我的接收器检测到的所有卫星,我必须输出它们是什么类型的卫星。在代码中,它们都是用这个十六进制数定义的。我只想输出SYS_SBS而不是2。如果你不能更改源代码,那么你怎么能输出任何东西呢?是否要从0x02-->SYS\u SBS中查找表?一些?严格化是标准的一部分,不是所有的,所有的C和C++编译器都提供了这个。我不知道这是一个标准功能。@LBg实际上我更喜欢单返回语句变量,而不是您刚才在我的答案中修补的那个。但是你是对的:我忘记了我例子中的return语句,他说他对源代码没有控制权。他如何编辑源代码?这与直接打印“SYS_SBS”基本相同。特别是,它不执行任何类型的健全性检查。如果您在
id()
宏的参数中有输入错误,您只会在为时过晚时才注意到。这个问题有点奇怪,但这个答案并不是更好。也许我不太理解这个问题。
const char *myType2str(int value)
{
    switch (value)
    {
        case SYS_SBS:
            return "SYS_SBS";

        default:
            return "UNKNOWN VALUE";
    }
}