2016-08-30 4 views
2

スタイルの問題か、おそらく私が気づいていない医療過誤だけです。C++ライブラリ包括ガード

私は現在、私の最初のソフトウェアを書いています。これは、自分以外の人が使用し、レビューするものです。私のコードを書いているときにヘッダーを呼び出すときに、同じヘッダーをファイル間で複数回呼び出すのは悪い習慣です。両方とも持っている場合

exampleClass.h

#ifndef BUG_H 
#define BUG_H 
#include<string> 

class Bug{ 
private: 
    int bug_id; //6 digit int 
    Date creation_ts; //Date object containing time of creation 
    std::string short_desc; //Short description of bug 
    std::string classification; //Catagory of bug_id 
    std::string product; //What product is the bug regarding 
    std::string component 
} 

#endif 

anotherExample.h

#ifndef ANOTHEREXAMPLE_H 
#define ANOTHEREXAMPLE_H 
#include<string> 

class Pug{ 
private: 
    int bug_id; //6 digit int 
    Date creation_ts; //Date object containing time of creation 
    std::string short_desc; //Short description of bug 
    std::string classification; //Catagory of bug_id 
    std::string product; //What product is the bug regarding 
    std::string component 
} 

#endif 

例えば

は、二つの異なるヘッダファイルに二回の文字列を含むに何か問題はあります依存関係?これは、ソフトウェアの寿命後にエラーを引き起こすでしょうか?

+0

それは 'が'自身の持っている可能性が非常に高いのです[*ヘッダー*をガードを含める](https://en.wikipedia.org/wiki/Include_guard)。 –

答えて

2

2つのファイルが無関係である場合(たとえば、両方が同じソースに含まれていない場合)は選択できません。そうでなければ、それは本当に重要ではありません。なぜなら、あなたが1つのファイルを別のファイルに含めた場合、<string>はとにかく含まれるからです。ファイルの1つにまだそれが必要です。しかし、1つのファイルにファイルが必要な場合は、常にが含まれています。ある人が他のファイルを含めるのを忘れるかもしれず、コードがコンパイルされないというリスクが常にあります。リスクを冒さずに、クライアントを信頼してください。

さらに、std::stringにはガードも含まれているため、複数のインクルードを心配する必要はありません。

#pragma once 
#ifndef HEADER_H 
#define HEADER_H 
//.....Code 
#endif 

あなたは可能性が常に#pragmaまたは#define、(1またはその他のような)が、パットは、古いコンパイラドンいるので、ヘッダーガードを保証両方」:また、インクルージョンの安全のために、あなたはこれがあなたのヘッダをfrと行うことができます両方の依存関係を持っている場合トン支援#pragma once

+0

は答えを出した後に編集された質問ですか?今のところ私はその質問を本当に理解していないし、OPがすでにそれらを持っているときに警備員を説明する理由を理解していない。 – user463035818

+0

OPはdobule定義エラーやダブルインクルージョンエラーを心配しないようにするために、 tobi303 –

+0

hm ok。質問が編集されなかった場合は、OPが実際に目的を理解していないまま使用しているように思えますし、あなたの説明は無関係です。 – user463035818

1

は、二つの異なるヘッダファイルに二回の文字列を含むに何か問題はありますか?これは、ソフトウェアの寿命後にエラーを引き起こすでしょうか?実際に

いいえ、あなたは、あなたが実際に依存性を持つすべてのヘッダファイルを含める必要があります。依存関係を含む他のヘッダーに依存するべきではありません。エラーの原因となるすべてのヘッダーを含めることができません。あなたのクラスにstd::stringが必要な場合は、<string>を含める必要があります。期間。

すべてのヘッダーには、ガードが含まれている必要があります(#ifndefまたは#pragma onceの品種)。確かに、あなたの標準ライブラリ実装のものはそうです。余分なインクルードの欠点は余分な前処理時間であり、コードのコンパイルが保証されています。

1

クラスで使用している場合は、stringを含める必要があります。 stringも複数の包含物から保護されているので、問題ありません。

がところで、複数の介在物を回避するためにifdefsより良い方法があります:

#pragma once 
+0

[/C++の "#pragma once" ISO規格?](http://stackoverflow.com/questions/1695807/why-isnt-c-cs-pragma-once-an-iso-standard) –

関連する問題