フリーソフト

« 背景 | トップページ | スコープ »

ヘッダファイル

このドキュメントは、Google C++ Style Guideを翻訳、要約したものです。省略した部分や意訳した部分が多くあります。原文の意図が伝わるよう注意しましたが、誤りが含まれているかもしれません。正確な情報については、必ず原文を参照してください。

前へ | 目次 | 次へ

ヘッダファイル

すべての .ccファイルに対して、対応する .hファイルを用意すること。ただし、ユニットテストや小さな .ccファイル(main関数のみなど)は除く。

自己完結したヘッダ

ヘッダファイルの拡張子は .hとすること。ヘッダではないテキストファイルは .incとすること。–inl.hヘッダは分割してはならない。

ヘッダは自己完結とすること。ヘッダをインクルードする際に特別な条件を要求してはならない。ヘッダは、他の必要なヘッダをすべてインクルードし、特定のシンボルが定義されていることを仮定してはならない。

テンプレートやインライン関数を .hファイルに宣言する場合は、同じファイルに定義も書くこと。また、これらの関数を使用するすべての .ccファイルでこのヘッダをインクルードすること。これらの定義を別々の-inl.hファイルに移動してはならない。

例外として、関数テンプレートがクラスのprivateメンバである場合や、明示的にインスタンス化される場合は、テンプレートをインスタンス化している .ccファイルに定義を記述してもよい。

#defineガード

多重インクルードを防ぐため、すべてのヘッダに #defineガードを設けること。シンボル名の形式は、<PROJECT>_<PATH>_<FILE>_H_ とすること。

例えば、fooプロジェクトのfoo/src/bar/baz.hの場合は以下のようになる。

#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
...
#endif  // FOO_BAR_BAZ_H_

前方宣言

不要なファイルオープンや再コンパイルを避けるため、前方宣言を使用すること。

コードで使用されるシンボルは、#includeから前方宣言に置き換えられる場合が多い。置き換えの指針は以下の通り。

  • ヘッダ内で宣言されている関数を使う場合は常にヘッダを #includeすること。
  • クラステンプレートを使う場合はそのヘッダを #includeした方がよい。
  • 通常クラスは前方宣言を使用してもよいが、前方宣言では不十分な場合があるので注意すること。不確かな場合は #includeを使うこと。
  • #includeを避けるためだけに、データメンバをポインタに置き換えることは禁止。

インライン関数

関数が小さいとき(10行以下)のみインライン関数にすること。10行を超える関数や、ループやスイッチ文がある関数をインライン化するコストメリットは小さい。

デストラクタに注意すること。暗黙的なメンバや基本クラスのデストラクタは見た目以上に行数が多い場合がある。また、仮想関数や再帰関数はインライン宣言してもインライン化されない。

関数パラメータの順序

パラメータは、入力、出力の順とすること。

これは厳格なルールではない。入力でも出力でもあるパラメータがあるため。また、関連する関数群に一貫性を持たせるためにルールを曲げてもよい。

名前とインクルードの順序

ヘッダファイルのインクルード順序は、その .ccの対応ヘッダ、Cライブラリ、C++ライブラリ、他ライブラリのヘッダ、プロジェクトのヘッダとすること。各セクション内では、アルファベット順に並べること。可読性が高まり、依存関係が明確となる。

例外として、条件付きインクルードは、他のインクルードの後に置いてもよい。

ヘッダファイルは、そのプロジェクトのソースディレクトリ配下に置くこと。ディレクトリの省略形である .(カレントディレクトリ)や ..(親ディレクトリ)は使用しない。

例えば、project/src/foo/internal/fooserver.ccのインクルードは以下のようになる。

#include "foo/server/fooserver.h"

#include <sys/types.h>
#include <unistd.h>
#include <hash_map>
#include <vector>

#include "base/basictypes.h"
#include "base/commandlineflags.h"
#include "foo/server/bar.h"

前へ | 目次 | 次へ

« 背景 | トップページ | スコープ »

技術文書」カテゴリの記事