2020/05/01
はじめに
普段の開発(およびプログラミング学習)では、とりあえず目的を”果たすであろう”プログラムを思うがままに書き、コンパイラのメッセージを読んでからコードを直すようにしている。 しかし、その方法ではいちいちコンパイルメッセージを確認する必要があるため、開発速度を損なう可能性があると感じた。また、ホワイトボードコーディング等ではコンパイラメッセージを元にコードミス(タイポ含む)を都度確認する事ができない場合がある。 よって、コーディング中にコンパイルなしでデバッグする意義が少しはあるのではないかと感じた。
そこで、自分がコンパイルした際によく引き起こすエラーを備忘録として目に見える形にする事で、コンパイル前の目視確認のポイントを具体化しようと考えた。
よくある集
アルゴリズムが対応する入力値
配列を引数とする場合、要素が空の場合には対応できないアルゴリズムを書く事がたまにある。 その際に、関数の最初に早期リターンするのだが、よく忘れる。
range-based-for
配列に対してのループ処理において、プログラムを簡潔に記述するために、for/range-based-for を切り替える事がよくある。その際、要素の表現v[i]/e
を更新し忘れてしまう事がよくある。
ラムダ式
式定義後の忘れ物
ラムダ式を定義する時は、関数のようなイメージで定義する。普通の関数は末尾に;
が不要なため、ラムダ式においてもついつい忘れてしまう。
キャプチャの追加
[&]
として全てキャプチャしている場合は関係ないが、各変数に対してキャプチャを設定している場合は注意が必要。
式の記述と共に必要な変数が増える事で式内部で扱う変数をキャプチャし忘れてしまう場合がある。
式定義の更新忘れ
auto [](){};
の場合は心配する必要がないが、私の場合は(是非はともかくとして)ラムダを再帰するために予めfunction<void(int, int)>
のように定義している。その際、式記述中に宣言行記述時よりも脳内が整理されて戻り値・引数を変更したくなる事がよくある。その場合、戻り値・引数を式内部では変更しているが式の定義の方を更新し忘れてしまう事がよくある。
エラーメッセージへの対処
func was not declared in this scope
関数が宣言されていないと言われている。
std::
の関数であれば、std::func
とする事で対応できる。
おわりに
頻出順による掲載順変更を含めて、随時更新しようと思う。