0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【ネタ】関数のreturn文を1つにしたい

Last updated at Posted at 2024-05-22

return文が複数ある関数を作ったら、静的解析で次の警告が出て、直すのに困ったことがある。

MISRA-C:2004 Rule 14.7
関数では、関数の最後に唯一の出口がなくてはならない。

実際のコードを簡略化したのが、次のコード。
return 1のところを直そうとすると、その下のmoreFunction(arg2)が邪魔になって、ややこしくなりそう...。goto文も使いたくないし...。

// 例:return文が4つある関数

int function(int arg1, int arg2){
    int var = -1;
    
    if(arg1 == 1){
        var = someFunction(arg2);
        if(var == 1){
            return 1;     // return文 (1つ)
        }else if(var == 2){
            arg2 += 2;
        }
        moreFunction(arg2);
        return 4;         // return文 (2つ)
    }else if(arg2 == 2){
        return 2;         // return文 (3つ)
    }
    
    return 0;             // return文 (4つ)
}

次のコードのように、全体をdo~while()で囲めば、breakで最後のreturnにジャンプ出来るので、簡単に直せるのではと思ったけど、レビューで怒られそうな気がしてやらなかった。

// 例:return文が4つあった関数

int function(int arg1, int arg2){
    int var = -1;
    int ret = 0;          // 追加

    do{                   // 追加
        if(arg1 == 1){
            var = someFunction(arg2);
            if (var == 1) {
                ret = 1;  // 修正
                break;    // 追加
            }else if(var == 2){
                arg2 += 2;
            }
            moreFunction(arg2);
            ret = 4;      // 修正
            break;        // 追加
        }else if(arg2 == 2){
            ret = 2;      // 修正
            break;        // 追加
        }
    }while(0);            // 追加
    
    return ret;           // return文 (4つ→1つ)
}

...が、数年後、別の仕事で全体をdo~while()で囲んだコードに出会った!
同じことを考える人がいるのかと思ったけど、自分が知らないだけで、有名な方法なのかも。

0
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?