23

ヘッダーファイルを含む他のすべてのファイルに対して冗長コピーが作成されるため、ヘッダーファイルに何も定義しないことが通常どのように最善であるかについて読みました。ただし、静的インラインメソッドの場合は、その場で定義する必要があるようです(少なくとも、Visual Studio 2010では定義できません)。したがって、ヘッダーファイルにインターフェイスを記述した場合、クラス定義の外部または.cppファイルで静的インラインメソッドを定義することはできません。

それで、静的インラインメソッドをわざわざ使用する必要がありますか?そして関連する質問:ヘッダーファイルでメソッドや変数を定義する必要がありますか(定数はどうですか)?

とにかく、奇妙なことに、それは私のC++の本で詳細に説明されているものではありません。

編集:静的インラインメソッドに関する同様の質問を読みましたが、この問題に直接対処しているものはないようです。

4

2 に答える 2

44

ヘッダーファイルに関数定義を追加するにはどうすればよいですか?

これは、次の3つの方法で実現できます。

  1. 関数のマーキングinlineまたは
  2. 関数を作成するstatic
  3. 関数を匿名の名前空間に配置します。

そうするための正しい方法は何ですか?

#1つまり、関数にマークを付けることは、単一定義規則inlineに違反することなくこれを行う正しい方法です。

他の2つのアプローチの何が問題になっていますか?

両方#2#3各変換ユニットには、独自のバージョンの関数が含まれ、プログラムにはいくつかの異なるバージョンの関数が含まれるため、生成されるバイナリのサイズが大きくなります。
つまり、static関数の場合fun()&funは変換単位ごとに異なり、プログラムにNは関数の異なるバージョンが含まれます。
また、関数に静的ローカル変数が含まれている場合は、N関数インスタンスごとに1つずつ、異なる静的ローカル変数があります。

最初のアプローチでこの問題をどのように回避しますか?

関数には外部inlineリンケージがあります。
関数にマークを付けると、inlineその関数はすべての変換単位で同じアドレスを持ちます。また、インライン関数の本体内で定義された静的ローカルおよび文字列リテラルは、変換ユニット全体で同じオブジェクトとして扱われます。
つまり、インライン関数はすべての変換ユニットで同じアドレスを持ちます。

static inlineヘッダーの関数定義はどのように扱われますか?

キーワードはstatic、関数に内部リンケージを強制します。
インラインとして定義された関数の各インスタンスは個別の関数として扱われ、各インスタンスには静的ローカルと文字列リテラルの独自のコピーがあります。したがって、これはに似てい#2ます。

注:
標準inlineでは、ユーザープログラムの関数のすべての定義が、関数が使用または呼び出されるすべての変換単位でまったく同じ定義を持っている必要があります。


関連するスタンダーデスの参考文献:

C++03標準

3.2 1つの定義規則:
パラ3:

すべてのプログラムには、そのプログラムで使用されるすべての非インライン関数またはオブジェクトの定義が1つだけ含まれている必要があります。診断は必要ありません。定義は、プログラムに明示的に表示することも、標準またはユーザー定義のライブラリに含めることも、(適切な場合は)暗黙的に定義することもできます(12.1、12.4、および12.8を参照)。インライン関数は、それが使用されるすべての変換単位で定義されるものとします。

7.1.2関数指定子
パラ4:

インライン関数は、それが使用されるすべての変換単位で定義され、すべての場合でまったく同じ定義を持つ必要があります(3.2)。[注:インライン関数の呼び出しは、その定義が変換ユニットに表示される前に発生する可能性があります。]外部リンケージを持つ関数が1つの変換単位でインラインとして宣言されている場合、それが表示されるすべての変換単位でインラインで宣言されるものとします。診断は必要ありません。外部リンケージを持つインライン関数は、すべての変換ユニットで同じアドレスを持つ必要があります。anexternインライン関数の静的ローカル変数は、常に同じオブジェクトを参照します。externインライン関数の文字列リテラルは、異なる変換単位の同じオブジェクトです。

于 2012-06-01T09:02:21.793 に答える
7

(1)クラス定義の外または.cppファイルで静的インラインメソッドを定義できません。

static inlineヘッダーファイル内のクラスの外部でメソッドを定義できます。デモ。.cppファイルで定義することはできません。

(2)静的インラインメソッドをわざわざ使用する必要があります

簡単に回避できると思います。独自の目的でヘッダーファイルの本文を表示する必要がある場合は、それらを作成するだけinlineです。

(3)ヘッダーファイルでメソッドや変数を定義する必要があります(定数はどうですか)

  1. クラス本体内で、static const積分型のデータを定義できます。
  2. staticメソッドはクラス本体内で定義できます
  3. static inlineメソッドは、クラス本体の内部またはヘッダーファイル内のクラス本体の外部で定義できます。
  4. static単一定義規則.cppに準拠するには、データメンバーを単一のファイルで定義する必要があります
于 2012-06-01T09:02:30.413 に答える