如何从预定义的常量中获取#define符号而不是值

时间:2012-09-17 06:33:19

标签: c++

我有一个C ++定义语句:

#define PING 10

在我的main函数中,我有类似的内容:

int main()
{
    int code;
    cout<<"enter command code";
    cin>>code;      // value entered 10
    cout<<code;   //here i want "PING" output instead of 10

    return 0;
}

如何在输出中用PING替换10?

编辑:

我将有多个#define

#define PING 10
#define STATUS 20
#define FETCH 74
#define ACK 12
#define TRAIL 9
#define EXIT 198

现在我的业务逻辑将只获得命令代码,即10或12等等

我想要检索该代码的相应命令名。如何可能?

3 个答案:

答案 0 :(得分:2)

如何更换:

cout << code;

使用:

if (code == PING)
    cout << "PING";
else
    cout << code;

如果你有一个#define,这是最简单的方法。对于更复杂的情况,您可以根据#define值查找要查找的字符串数组,例如:

#define E_OK        0
#define E_NOMEM     1
#define E_BADFILE   2
#define E_USERERROR 3
#define E_NEXT_ERR  4

static const char *errStr[] = {
    "Okay",
    "No memory left",
    "Bad file descriptor",
    "User is insane",
};
:
if ((errCode < 0) || (errCode >= E_NEXT_ERR))
    cout << "Unknown error: " << errCode << '\n';
else
    cout << "Error: " << errStr[errCode] << '\n';

如果值不同,您可以选择基于非阵列的解决方案,例如:

#define PING 10
#define STATUS 20
#define FETCH 74
#define ACK 12
#define TRAIL 9
#define EXIT 198
:
const char *toText (int errCode) {
    if (errCode == PING  ) return "Ping";
    if (errCode == STATUS) return "Status";
    if (errCode == FETCH ) return "Fetch";
    if (errCode == ACK   ) return "Ack";
    if (errCode == TRAIL ) return "Trail";
    if (errCode == EXIT  ) return "Exit";
                           return "No idea!";
}

可能想要考虑的另一件事是用枚举常量替换#define值。对于像这样的简单事情可能并不重要,但提供的类型安全性和额外信息几乎肯定会在您职业生涯的某些时候简化您的调试工作。

如今,我通常只使用#define进行条件编译。使用枚举更好地完成常量,并且已经很长时间了,因为我可以想出编译器应该和不应该是内联函数: - )

答案 1 :(得分:2)

您定义的PING是预处理器宏。 在PING的所有情况下,它将被简单地替换为10。

要打印PING代替10,您需要将字符串“PING”存储在某处,以便您可以在运行时打印它。

答案 2 :(得分:0)

您无法获得预处理程序指令的左值,因为#define在编译之前有效,并且只需用PING替换代码中所有出现的10。因此,如果您编写if(code == PING),那么在编译开始之前,预处理器将用if(code == 10)替换它,显然10是右值。

在您的情况下,您可以这样做:

int main()
{
    int code;
    cout<<"enter command code";
    cin>>code;      
    if( code == PING )
        cout<<code;   
    else 
        cout<<code;

    return 0;
}