この記事は、インテル® デベロッパー・ゾーンに公開されている「The Ultimate Question of Programming, Refactoring, and Everything」の日本語参考訳です。
この記事では、プログラマーがエラーを回避し、時間と労力を節約するのに役立つ C++ コーディングに関する 42 の推奨事項を紹介します。著者の Andrey Karpov 氏は、静的コード解析ツールである PVS-Studio の「プログラム検証システム」開発チームを率いるテクニカル・ディレクターとして、多数のオープンソース・プロジェクトの検証を通して、問題となる多種多様なコーディング手法を見てきました。ここでは、その知識と経験を皆さんと共有します。すべての推奨事項には実例が示されます。これらの推奨事項は C/C++ プログラマーを対象としていますが、多くは一般的なものであり、ほかの言語のプログラマーにも役立つでしょう。
目次
- コンパイラーの仕事をしない
- 0 よりも大きいは 1 を意味しない
- コピーは 1 回、チェックは2 回
- ?: 演算子に注意して、括弧で囲む
- 利用可能なツールを使用してコードを解析する
- ポインターを明示的に整数型へキャストしているすべてのコードを確認する
- ループ内で alloca() 関数を呼び出さない
- デストラクター内の例外は危険
- 終端 null 文字には ‘\0’ を使用する
- 複数の小さな #ifdef ブロックの使用は避ける
- 1 行にできるだけ多くの操作を詰め込もうとしない
- コピー & ペーストを使用する場合は特に最後の行に注意する
- 表形式を使用する
- 優れたコンパイラーとコーディング手法でも対応できない場合がある
- コードではできるだけ enum class を使用する
- 能力の誇示はプログラミングでは容認されない
- プライベート・データのクリアには専用の関数を使用する
- ある言語の知識は必ずしも別の言語に適用できるとは限らない
- あるコンストラクターを別のコンストラクターから適切に呼び出す方法
- ファイルの終わり (EOF) チェックだけでは不十分な場合がある
- ファイル終了文字 (EOF) に正しく到達したかチェックする
- #pragma warning(default:X) を使用しない
- 文字列リテラルの長さを自動的に評価する
- override 指定子と final 指定子を使用する
- ‘this’ を nullptr と比較しない
- 油断のならない VARIANT_BOOL
- 狡猾な BSTR 文字列
- 単純な関数を使用できる場合マクロは使用しない
- イテレーターでは後置インクリメント演算子 (i++) の代わりに前置インクリメント演算子(++i) を使用する
- Visual C++* と wprintf() 関数
- C および C++ では配列は値渡しされない
- 危険な printf
- null ポインターは逆参照しない
- 未定義の動作は考えているよりも身近なもの
- enum へ新しい定数を追加する際は switch 演算子も修正する
- PC の動作が不安定な場合はメモリーをチェックする
- do {…} while (…) 内の ‘continue’ 演算子に注意する
- 今後は NULL の代わりに nullptr を使用する
- 不正なコードが動作する理由
- 静的コード解析を使用する
- プロジェクトに新しいライブラリーを追加しない
- 関数名に “empty” を使用しない
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。