0

私は1つの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;
}

出力で10をPINGに置き換えるにはどうすればよいですか?

編集:

私は複数の#defineを持っています

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

これで、私のビジネスロジックはコマンドコード、つまり10または12などのみを取得します。

そのコードに対応するコマンド名を取得したいのですが、どうすれば可能ですか?

4

3 に答える 3

2

交換はどうですか:

cout << code;

と:

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

が1つしかない場合は、これが最も簡単な方法です#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!";
}

検討したいもう1つのこと#define、値を列挙型定数に置き換えることです。このような単純なことは問題ではないかもしれませんが、提供される型安全性と追加情報により、キャリアのある時点でのデバッグ作業がほぼ確実に容易になります。

現在、私は通常#define、条件付きコンパイルにのみ使用します。定数は列挙型でより適切に実行され、インライン関数であるべきものとすべきでないものについてコンパイラーを考え抜くことができてから長い時間が経ちました:-)

于 2012-09-17T06:38:03.647 に答える
2

定義したPINGは、プリプロセッサマクロです。PINGが発生するたびに、10に置き換えられます。

10の代わりにPINGを印刷するには、実行時に印刷できるように、文字列「PING」をどこかに格納する必要があります。

于 2012-09-17T06:39:27.983 に答える
0

プリプロセッサディレクティブの左辺値を取得することはできません。これは、コンパイルの前に機能し、コード内の#defineすべての出現箇所を。に置き換えるだけだからです。したがって、たとえば、と書くと、コンパイルが開始される前に、プリプロセッサがそれをに置き換えます。明らかに10は右辺値です。PING10if(code == PING)if(code == 10)

あなたの場合、あなたはこれを行うことができます:

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

    return 0;
}
于 2012-09-17T06:38:51.177 に答える