1

私は自分でオライリーの教科書を完成させようとしています。もう何が起こっているのか本当に理解できないところまで来ています。章を読みましたが、プログラミングの演習に着いたときに何をすべきかわかりません。この問題は簡単なように見えますが、わかりません。

質問: RETURN_STATUS と呼ばれるタイプと次の値を定義する一連のマクロを作成します: RETURN_SUCCESS、RETURN_WARNING、および RETURN_ERROR。RETURN_STATUS を引数として受け取り、致命的なエラーが発生した場合に true を返すマクロ CHECK_RETURN_FATAL を定義します。

私のアプローチ:

#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;
}

これは、奇跡が起こることを願って私がまとめた BS の一部です。私は間違っていた。私が本当にやるべきことの説明は完璧でしょう。ありがとう。

4

2 に答える 2

3

C/C++ では、マクロ定義は左側の識別子と右側の要素で構成され、プログラムの本体でマクロの出現ごとに置き換えられます。このメカニズムは、複数の場所で定数を使用する必要がある場合に役立ちます (C++ はそのような状況に対してより優れたメカニズムを提供しますが、質問はプリプロセッサについて尋ねているので、それに集中しましょう)。

たとえば、次のように の型を と定義できRETURN_STATUSますint

#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 に答える