2013-08-03 11 views
10

Manyotherquestions変数をヘッダーファイルで宣言し、.cppファイルで定義(割り当て)することによって変数を割り当てる方法を扱います。C++ヘッダーで静的変数を宣言して定義しますか?

私がしたいことは、自分のクラスには.cppファイルを使用せず、すべての関数をインライン(ヘッダファイル内)として定義することです。私が遭遇する問題は、.hファイルが複数のコンパイル単位に含まれていても、「最初にここで定義された」リンカーエラーを取得しないように静的メンバー変数を定義する方法です。

私は、プリプロセッサやハックなどにオープンしています。私はちょうど.cppファイルを避けたい。

私はGCCを使用しています。

+0

変数を 'static'として宣言するだけです。変数の新しいインスタンスがヘッダーファイルをインクルードする各翻訳単位で作成されますが、リンク時にはオブジェクトに静的なリンケージがあるため、競合は発生しません。 –

+0

静的データメンバーには外部リンケージがありません。 – jrok

+0

"それを定義する(割り当てる)":**定義する**と**割り当てる**は2つの異なるものです。 –

答えて

13

あなたが本当にすべての.cppを避けなければならない場合は、シングルトンパターンを乱用することができますファイル:

class Foo { 
    public: 
     static Bar& getMyStatic() { 
      static Bar bar; 
      return bar; 
     }; 
}; 

これは変数が関数内の静的変数であり、staticは、クラス・コンテキスト内ではなく、関数コンテキスト内で異なる意味を持ちます。関数の場合、リンカーは複数の同一の定義を認識し、コピーを破棄します。

もちろん、私は.cppファイルを避けることを強く推奨します。つまり、プログラム全体または少なくともその大部分を1つの大きな部分に組み込む必要があるということです。変更を行うたびに、完全な再構築が必要になります。これにより、変更コンパイルテストのサイクルが大幅に遅くなります。非常に小さなプロジェクトの場合は問題ではないかもしれませんが、中規模から大規模のプロジェクトでは問題ありません。

+0

これは、静的変数を.cppファイルに入れるのを避けるための最良の(そして唯一の)方法のようです。コンパイル時:私のコンパイルされたコードは32KBに制限されているので、それにかかる時間の上限が設定されます。 – srlm

-1

プロジェクト全体にヘッダーファイルを1つだけ含めれば、問題ありません。しかし、それは非常に強力な要件であり、他人を遵守させることは難しいかもしれません。

変数はstaticである可能性がありますが、それはプログラム全体に複数の変数があることを意味します(今後変更することはできませんのでご注意ください)。 "潜在的なバグ"として知られています - あなたはいくつかの他のコードを変更し、突然あなたは新しいバグを作成しました。

+1

問題はそれが重要であることを開始できないかもしれないが、将来それはするかもしれないし、不注意にバグを導入する –

+0

絶対に、それは良い点です。 –

0

静的変数の場合、複数の静的変数の可能性を避けるために、静的変数を.cppファイルに入れる必要があります。それだけでなく、コンパイラへのヒントですが、コンパイルに時間がかかります(開発時にこれらの関数の一部を変更してから、多くの依存ファイルをコンパイルする必要があります)

しかし、それらを格納するための1つのファイルだけを持っていないなぜあなたはそれでわずか数静との.cppファイルの多くを望んでいない場合。

関連する問題