0

コンパイラが検出しているエラーを解決する必要があります-そのエラーを検出する理由は理解していますが、(エラーをスローする) 関数はポインター初期化されたときにのみ実行されるため、解決する必要があります。

ここに私の疑似コードがあります:

if (incoming_message_exists) 
{
    msg_class* current_msg;

    /*current_msg will become either value_1 or value_2*/

    /*code block 1*/
    if (condition_is_fulfilled)
    {
        current_msg = value_1;
    }

    /*code block 2*/
    else 
    {
        current_msg = value_2;
    }

    /*code block 3*/
    /*bool function performed on current_msg that is throwing error*/
    if (function(current_msg))
    {
        //carry out function 
    }
}

1 と 2 の中でコード ブロック 3 を実行したくないのですが、それが唯一の解決策である場合は実行します。前もって感謝します!

4

1 に答える 1

5

あなたが私たちに示したifelseブランチは、2 つの異なるifステートメントからのものですか?

そうである場合、現在のコードは初期化されていないままにすることができますcurrent_msg。に到達すると、これはクラッシュする可能性がありますfunction(current_msg)

同じステートメントに対して 2 つの分岐を示した場合if、コンパイラは間違っています。初期化されないという危険はありcurrent_msgません。ただし、警告をエラーとしてビルドする場合など、警告を抑制するためにコードを変更する必要がある場合があります。

current_msg宣言されたときに初期化するだけで、警告を修正/抑制できます

msg_class* current_msg = NULL;

どちらのブランチにも他のコードがない場合は、三項演算子を使用して初期化することもできます

msg_class* current_msg = condition_is_fulfilled? value_1 : value_2;

警告が本物である場合は、引数functionが渡されたことに対処するか、これを防ぐかを確認する必要があります。NULL

if (current_msg != NULL && function(current_msg))
于 2013-05-21T09:36:55.047 に答える