6

グローバルと静的グローバルの違いは、グローバル変数はexternを介して別の実装ファイルで参照できるのに対し、静的グローバルはその実装ファイルにのみローカライズされることです。詳細については、次の 2 つの質問を参照してください: [ 1 , 2 ]。

私が理解していることから、これは次のことを意味し、同じようにリンクする必要がありますfoo()bar()どちらの機能も でのみ使用できますMyClass

//MyClass.h
Class MyClass{
private:
  static void foo();
};

//MyClass.cpp
void MyClass::foo(){}
static void bar(){}

の宣言は、ヘッダー ファイルがクラス全体をより完全にレイアウトできるため、より一般的であることがわかります(foo()プライベートなものを使用できない/使用しない場合でも)。bar()ヘッダファイル)?

コンテキストとして、動作するために静的である必要がある for Windows メッセージを定義しWNDPROCていますが、それはかなり醜い宣言であり、実装ファイルで完全に非表示にするか、先に進んでヘッダー ファイルで宣言するかがわかりません。 .

4

1 に答える 1

10

static は、コンテキストに応じてさまざまな意味を持つため、非常に恐ろしいキーワードです。静的変数と静的関数はまったく異なり、クラス内の静的関数と静的自由関数はまったく異なります。

クラス内の静的関数は、クラスのインスタンスなしで関数を呼び出すことができることを意味しますが、クラスの非静的メンバーにはアクセスできません。これは通常の関数に少し似ていますが、整理のためにクラスに含まれているだけです。

static free-function には内部リンケージがあるため、ソース ファイルの外では見ることができず、その名前は他のソース ファイルで再利用できます。

静的クラス関数には内部リンケージがありません。すべてのクラス関数には外部リンケージがあります。クラス関数が静的であるかどうかに関係なく、クラス関数をヘッダー ファイルとソース ファイルに分割できます。

static のさまざまな用途をより明確に理解するために、いくつかのチュートリアル/本を読むことをお勧めします。見たことのない場所で静電気が発生した場合は、何も想定しないでください。

ソースファイルに非表示にしたいフリー関数がある場合は、それを static と宣言することができます。または、名前のない名前空間に配置することもできます。

// cpp file only
namespace
{
    void hiddenfunc() {..}
}

これは似ています

static void hiddenfunc();

そして、同じ方法で呼び出すことができます ("hiddenfunc()" と同じように)。名前のない名前空間 (私が知っている奇妙な名前) の利点は、そのソース ファイル内でのみ表示したいクラスやその他の定義を配置できることです。名前空間 {..} 領域内で関数本体を定義していることを確認してください。名前のない名前空間をヘッダー ファイルに配置しないでください。

于 2013-07-29T16:07:15.333 に答える