この記事は、LLVM Coding Standards 翻訳の2/4です。
前:はじめに | 目次 | 次:機械的なソースの問題
言語、ライブラリ、および標準
コーディング標準を用いる、LLVM及びその他LLVMプロジェクトに含まれるソースコードの大半は、C++コードです。いくつかの部位では、環境の制約、歴史的な制限、またはサードパーティ製のソースコード利用に由来して、Cコードが用いられています。全体としては、規格に準拠しモダンでポータブルなC++コードを、実装言語とします。
C++標準のバージョン
LLVM、Clang、そしてLLDは現在C++11に適合して書かれていますが、ホストコンパイラとしてサポートされる主要なツールチェーンで利用可能な機能に限定しています。LLDBプロジェクトはサポートされるホストコンパイラのセットもより積極的であり、したがって、さらに多くの機能を使用しています。利用できる機能に関わらず、コードは(合理的な範囲で)標準に則りポータブルでモダンなC++11コードであることが期待されます。不要なベンダー固有の拡張等は避けます。
C++標準ライブラリ
C++標準ライブラリを活用してください。LLVMや関連するプロジェクトは、標準ライブラリ機能を重視し可能な限り用いています。標準インタフェース(策定中含む)から見て標準ライブラリに欠けている機能については、共通サポートライブラリとして、LLVM名前空間内に期待されるインタフェースに沿い実装されます。
標準I/Oストリーム非使用等の、いくつかの例外があります。これらについては、プログラマーズマニュアルにより詳細な情報があります。
利用するC++11言語とライブラリの機能
LLVM、Clang、およびLLDではC++11を使用していますが、ツールチェーンで利用可能な機能すべてを用いるわけではありません。LLVM内で用いられる機能セットは、MSVC 2013、GCC 4.7、およびClang 3.1でサポートされているものです1。このセットの最終的な定義は、各ツールチェーンによるビルドボットが受け入れるものです。ビルドボットと議論しないでください。しかし、何を想定してよいかの助けとして、下記のような手引きがあります。
各ツールチェーンは、それが何を受け入れるかの良いリファレンスを提供します。
- Clang: http://clang.llvm.org/cxx_status.html
- GCC: http://gcc.gnu.org/projects/cxx0x.html
- MSVC: http://msdn.microsoft.com/en-us/library/hh567368.aspx
ほとんどの場合、MSVCのリストが支配的要因となります。ここに動作することが期待される機能をざっと示します。このリストにない機能は、私たちのホストコンパイラではサポートされそうにありません。
-
右辺値参照: N2118
- ただし、
*this
やメンバ関数への修飾については、右辺値参照 禁止
- ただし、
-
Static assert: N1720
-
後置戻り型: N2541
-
ラムダ: N2927
- ただし、デフォルト引数と合わせての利用は 禁止 。
-
decltype
: N2343 -
連続する閉じ山かっこ: N1757
-
Extern templates: N1987
-
nullptr
: N2431 -
ローカル型や無名型のテンプレート引数: N2657
-
範囲によるforループ: N2930
- ただし、
do {} while()
ループの周りは{}
が必要です。そのため、関数マクロ内の範囲によるforループでも{}
が要求されます。
- ただし、
-
アトミック操作とC++11メモリモデル: N2429
-
可変個引数テンプレート: N2242
-
明示的な変換演算子: N2437
-
関数のdefault&delete宣言: N2346
- But not defaulted move constructors or move assignment operators, MSVC 2013
: cannot synthesize them.
- But not defaulted move constructors or move assignment operators, MSVC 2013
-
初期化子リスト: N2627
-
委譲コンストラクタ: N1986
-
デフォルトのメンバ初期化子(非静的データメンバ初期化子): N2756
- 明示的に初期化されないスカラメンバでのみ使用してください。非スカラのメンバは、一般により適切なデフォルトコンストラクタを持っており、そしてMSVC 2013では波かっこの初期化子リストによる問題を抱えています。
C++11標準ライブラリでサポートされた機能は、十分に追跡されていないうえ、とても大きすぎます。ほとんどの標準ライブラリは、C++11ライブラリのほぼ全てを実装しています。あるいはLinuxでのサポートが共通項となるでしょう。libc++では、テストや文書化は十分ではありませんが、ほぼ完全であることが見込めます。場合にもよりますが。libstdc++の場合は、the libstdc++ manualで詳細な文書化がなされています。一般には問題ありませんが、注意を要するわずかな不足が数点あります。
- type traitsの一部が未実装です
- 正規表現ライブラリはありません。
- アトミックライブラリの大部分は十分に実装されていますが、フェンスがありません。幸いなことに、それらはほとんど必要ありません。
- ロケールのサポートは不完全です。
これら以外については、ビルドボットが知らせるまでは標準ライブラリが使えると想定して進めてよいでしょう。これら不確実な点について進めており、Linuxシステム上でテストすることができない場合は、そういった機能の使用を最小限に抑え、Linuxビルドボットがバグを検出しないか注視することが最善のアプローチとなるでしょう。例として、type traitの未実装を踏んでしまった場合は、LLVMのtraitsヘッダにそれのエミュレートを追加します。
その他の言語
Go言語で記述されたコードは、以下の書式ルールの対象にはなりません。その代わりに、 gofmt ツールによる整形を採用しています。
Goコードは慣習に倣うよう努力すべきです。Effective Go および Go Code Review Comments 2の2つがこれの良いガイドラインとなります。
前:はじめに | 目次 | 次:機械的なソースの問題
-
訳注:次リリースでは、MSVC2015(Update3)、GCC 4.8、Clang 3.1にアップデートされるようです ↩