2020年2月21日金曜日

goto滅ぼすべし(1)

VisualStudio2019になって、C++Coreガイドラインのチェックが標準になったおかげで、C++でC言語的な書き方をしている箇所や、古いC++の書き方をしてる箇所に軒並み警告が出るようになってしまった。
その中でもC26438の「gotoは使わない」が厄介だ。
最近の人は教育が行き届いていて、gotoのような劇薬から遠ざけられているおかげでどう修正していいのか見当がつかない。ということを雑談しているときに気づいた。
自分の忘備録と他にも困った人のために、修正方法をメモる。

今回はエラーがあったらgoto先に飛ばして終わらせるパターン。

void AruClass::someFunction(uint8_t param) {
  if( sendFunction( param) < 0) {
    goto errorExit;
  }
  if( recvFunction() < 0) {
    goto errorExit;
  }
  parseRecvData();
errorExit:
  cleanupBuffer();
  return;
}

こんなケースだ。
一番わかりやすいケースで、exceptionにしてやればいいだけだ。

void AruClass::someFunction(uint8_t param){
  try{
    if( sendFuntion( param) < 0) {
        throw std::exception();
    }
    if( recvFunction() < 0) {
        throw std::exception();
    }
    parseRecvData();
  }
  catch(...){
      // error case
  }
  cleanupBuffer();
  return;
}