web-dev-qa-db-ja.com

C ++ヘッダーで静的変数を宣言して定義しますか?

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

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

それが仕事を成し遂げるならば、私はプリプロセッサハックなどにオープンです。 .cppファイルは避けたいだけです。

重要な場合は、GCCを使用しています。

12
srlm

.cppファイルを本当に回避する必要がある場合は、シングルトンパターンを悪用できます。

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

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

ただし、もちろん、.cppファイルを使用しないことを強くお勧めします。これは、プログラム全体または少なくともその大部分を1つの大きな部分でビルドする必要がある状況に陥ることを意味します。変更を加えるたびに完全な再構築が必要になり、変更-コンパイル-テストのサイクルが大幅に遅くなります。問題にならないかもしれない非常に小さなプロジェクトの場合ですが、中規模から大規模のプロジェクトの場合です。

14
cmaster

静的変数を使用する場合は、.cppファイルを挿入して、静的変数を1つだけにする場合に複数の静的変数が発生する可能性を回避する必要があります。さらに、大きなインラインメソッドを使用することは、コンパイラへのヒントにすぎないだけでなく、コンパイルに時間がかかるため、お勧めできません(開発中にこれらの関数の一部を変更すると、多くの依存ファイルをコンパイルする必要があります!)

ただし、いくつかの統計を含む多くの.cppファイルが必要ない場合は、それらを格納するファイルを1つだけにしないでください。

0
Ed Heal