如何输出#define值

时间:2013-07-15 12:42:51

标签: c++ c

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

我的代码中有以下内容

#define SYS_SBS     0x02 

每当我尝试使用它并尝试输出时,我得到2作为值,但是我想让SYS_SBS作为我程序的输出。有办法,我可以这样做。

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

其他详细信息:我无法更改某些头文件。但是我可以在.cpp文件中更改主要功能。我希望SYS_SBS作为输出。我正在使用卫星和我的接收器检测到的所有卫星,我必须输出它们是什么类型的卫星。在代码中,所有这些都是用这个十六进制数定义的。我只想输出SYS_SBS而不是2

3 个答案:

答案 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" };