**現代のプログラミングで実践しているC++習慣**
1. **説明的な変数名を使う**
- 単一文字の識別子は避け、意図が伝わる名前を選ぶ。
2. **不変データには `const` と `static const` を優先する**
- 変更されないことを保証し、コンパイラ最適化を促進する。
3. **RAII(Resource Acquisition Is Initialization)パターンを採用する**
- リソースの取得と解放をオブジェクトに閉じ込めることでリークを防止。
4. **必要に応じてヘッダーオンリ―ライブラリを利用する**
- コンパイル依存性が減り、ビルド時間が短縮される。
5. **型推論には `auto` を使う**
- 複雑なイテレータ型を簡潔にしつつ可読性を保つ。
6. **モダンなコンテナ初期化子を活用する**
- `std::vector<int> v{1, 2, 3};` は手動の `push_back` よりも明確で簡潔。
7. **Catch2 や Google Test のようなフレームワークで単体テストを書く**
- コードの正しさを保証し、リファクタリングを容易にする。
8. **関数は短く、目的を絞る**
- 単一責任原則を目指すことで保守性が向上する。
9. **Doxygen コメントでドキュメント化する**
- クリーンで検索可能な API ドキュメントを自動生成できる。
10. **最適化はプロファイル後に行う**
- ホットスポットを測定し、実際のパフォーマンスボトルネックに対処する。
## Japanese Translation:
作者は主にC#とPythonで作業していますが、バインディングやニッチなタスクのために依然としてC(またはC++)を使用します。これは細粒度の制御を提供するからです。Cには公式のスタイルガイドラインがないため、ブログ、Rust、および完璧主義的マインドセットから引き出した個人的な習慣を構築しています。
新しいプロジェクトでは、GCC/Clang/MSVCサポート付き**C23**を好み、`#if CHAR_BIT != 8 #error` を強制して8ビットの `char` を保証します。彼らは簡潔な typedef のセット(`u8`, `i8`, `i16`, `u16`, `i32`, `u32`, `u64`, `f32`, `f64`, `uptr`, `isize`, `usize`)を採用し、<stdbool.h> からの C23 の `bool` をブール値に使用します。
ヌル終端文字列を避けるために、彼らは **長さ+データ構造**(`String` に `u8 *data; isize len`)を使用します。「parse, don’t validate」に触発されてオープックタイプと信頼できるコンストラクタ(Lelenthran のブログ参照)を作成しています。C23 のタグ互換性により、マクロ (`Tuple2(T1,T2)`) を使って単純なタプルを定義できますが、名前付き構造体は必要です。
エラーハンドリングは **sum types** でモデル化されています:列挙型とそれに伴う構造体(`ErrorCode`, `SafeBuffer`, `MaybeBuffer`)が戻り値に成功または失敗を符号化します。作者は純粋な C では動的メモリ割り当てを意図的に避け、ヒープ重視のコードには Rust または C# を好みます;アレーナアロケータも言及されますが使用されません。
標準ライブラリの使用は最小限です。文字列関数はほとんど使わず、代わりに生の `mem*` 呼び出しを優先します。また、OS API はエルゴノミクスが悪いため再実装されることがよくあります。作者は外部関数のドキュメントを注意深く読むことを強調し、将来的により安全なメモリ取り扱いのために **「slice」タイプ** を追加することを検討しています。
全体として、この記事は読者が自分自身の C スタイルガイドラインを作成するよう奨励しつつ、言語の強みと挫折の両方を認めています。