1

我正在尝试自己完成一本 O'reilly 教科书。我到了一个我真的不明白发生了什么的地步。我阅读了这些章节,但在进行编程练习时根本不知道该怎么做。我知道这个问题看起来应该很容易,但我不知道。

问题:创建一组宏来定义称为 RETURN_STATUS 的类型和以下值:RETURN_SUCCESS、RETURN_WARNING 和 RETURN_ERROR。定义一个宏 CHECK_RETURN_FATAL,, 以 RETURN_STATUS 作为其参数,如果出现致命错误则返回 true。

我的方法:

#include <iostream>

#define RETURN_STATUS RETURN_SUCCESS RETURN_WARNING RETURN_STATUS RETURN_ERROR
#define CHECK_RETURN_FATAL (RETURN_STATUS)

int main()
{
    if (RETURN_STATUS == RETURN_ERROR)
        return true;
    else
    return false;

    return 0;
}

这只是我拼凑起来的一些废话,希望奇迹会发生。我错了。对我真正应该做什么的解释将是完美的。谢谢。

4

2 回答 2

3

在 C/C++ 中,宏定义由左侧的标识符和右侧的东西组成,每次出现的宏都会在程序主体中被替换。当您需要在多个地方使用常量时,这种机制很有用(C++ 为这种情况提供了更好的机制,但是由于您的问题是关于预处理器的,所以让我们专注于它)。

例如,您可以将类型定义为RETURN_STATUSint如下所示:

#define RETURN_STATUS int

现在,您可以通过为其值选择整数常量来定义常量,如下所示:

#define RETURN_SUCCESS 0
#define RETURN_WARNING 1
#define RETURN_ERROR 2

最后,您可以使用此宏检查错误的返回状态:

#define CHECK_RETURN_FATAL(s) (s == RETURN_ERROR)

以下是如何在实际代码中使用这些定义:

RETURN_STATUS check_password(const string& pwd) {
    if (pwd.size() == 0) return RETURN_ERROR;  // Empty passwords are not allowed
    if (pwd.size() < 8) return RETURN_WARNING; // Short passwords are bad
    return RETURN_SUCCESS;
}

...
string pwd("tiger");
RETURN_STATUS checkPwdStatus = check_password(pwd);
if (CHECK_RETURN_FATAL(checkPwdStatus)) {
    cerr << "Password check failed." << endl;
}
于 2013-05-30T00:34:32.293 回答
0

我认为一个典型的方式是返回一个错误码,它被定义为枚举类型,例如:

enum ReturnStatus {
    SUCCESS = 0,
    WARNING, 
    ERROR
};

然后您可以使用内联函数检查返回状态:

inline bool checkReturnFatal(const ReturnStatus status) {
    return status == ERROR;
}

希望这可以帮助。

于 2013-05-30T00:31:55.360 回答