質問

どのようC++などの警備員は。してしまいがちなこん:

#ifndef FOO_H
#define FOO_H

// ...

#endif

しかし、いと思うのは非常に直観的です。を見ることなくファイルのファイル名ではないか FOO_H があり、その名前をさします。

かる?

役に立ちましたか?

解決

私自身の経験から、コンベンションは、名前がすべてキャップであり、期間がアンダースコアに置き換えられていることを除いて、ヘッダーファイルを含むインクルージョンガードに名前を付けます。

そう test.h なります TEST_H.

これの実際の例には、クラスヘッダーファイルを自動生成するときにこの慣習に続くQT作成者が含まれます。

他のヒント

個人的にフォロブょうか。その一つの最大のコレクションのC++ライブラリの良い品質が周りのない問題です。

という言葉は一つもない:

<project>_<path_part1>_..._<path_partN>_<file>_<extension>_INCLUDED

// include/pet/project/file.hpp
#ifndef PET_PROJECT_FILE_HPP_INCLUDED

である:

  • 法律(注を開始する _[A-Z]__ いません)
  • 発生しやすい
  • あることが保証されてなどのガード内のプロジェクト(かす二つのファイルと同じ場所)
  • 保証は使用できない場合は終了他のマクロ INCLUDED いを損なうための戦い)

を読んでいことが見て変わっている。

かんくすべてのコンパイラの実装 #pragma once (または、 #pragma multiple やま"のデフォルトの動作に...)

直接撮影 Googleのスタイルガイド:

すべてのヘッダーファイルには、複数の包含を防ぐために#Defineガードが必要です。シンボル名の形式は次のとおりですu003CPROJECT>_u003CPATH> _u003CFILE> _H_。一意性を保証するには、プロジェクトのソースツリーのフルパスに基づいている必要があります。たとえば、プロジェクトfooのファイルfoo/src/bar/baz.hには、次のガードが必要です。

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

私は自分のプロジェクトでこのスタイルを使用しています。

#を含めるコードを見てください。

それが次の場合:

#include "mylib/myheader.h"

mylib/myheader.h すでにユニークな名前です。大文字と交換するだけです。と _

#define MYLIB_MYHEADER_H

インクルードパスに対して同じ名前を持つパスに2つのヘッダーがある場合、そのレベルですでに衝突があります。

交換 FOO_HFOO_H_INCLUDED そして、それはより明確です。

前に述べた他の人のように、非常に一般的な慣習は、名前の大文字版を使用することです。ドットはアンダースコアに置き換えられます:foo.h-> foo_h

ただし、これにより、単純な名前および/または一般的な名前との名前の衝突につながる可能性があります。このため、空でないビジュアルC C ++プロジェクトのSTDAFX.Hのような自動誘発ヘッダーは、次のようなランダムな文字列を追加します。

#ifndef FOO_H__NsknZfLkajnTFBpHIhKS
#define FOO_H__NsknZfLkajnTFBpHIhKS
#endif

http://www.random.org/strings/ これに役立つランダムジェネレーターです。

また、ファイルがいくつかのサブモジュールの一部である場合、またはその内容が1つの特定の名前空間に存在する場合、それをガードに追加する傾向があります。

#ifndef SOMECOMPONENT_FOO_H__NsknZfLkajnTFBpHIhKS
#define SOMECOMPONENT_FOO_H__NsknZfLkajnTFBpHIhKS

namespace somecomponent
{
  ...
}

#endif

私は通常、ようなものを使用します FOO_H_INCLUDED_. 。いくつかの(Microsoft)ヘッダーには、GUIDの文字列表現のように見えるものがありますが、私はそのような精巧なものを必要としませんでした。

通常、人々はファイル名でそれを行い、各ファイルのコードがコンパイルされて1回だけ追加されるようにします。あなたが望むものは何でもfoo_hを作ることができますが、私が今までコーディングまたは見たほとんどすべてのものがファイル名を使用しています。 Foo_Hが他の人のFOO_Hと矛盾したくないので、それがユニークであることを確認してください。

私は通常、それが何時かを見て、それを終わらせるためにそれを追加するだけです。 FOO_H_248, 、それは余分な予防策であり、とにかくそれを覚えておく必要はないので、それが謎めいているという事実を心配する必要はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top