2016-04-27 11 views
2

ヘッダに定義されたクラスメンバ関数の場合を格納変数staticとします。ヘッダーを複数のコンパイル単位に含めると、static変数の複数のコピーが作成されます。しかし、the compiler will fix this for youと出力された変数の1つを選択するだけです(これはインライン展開とは異なります)。これは、可能なタイプのシンボル、正確にはgnu_unique_objectのGNU固有の拡張によって可能になります(では "u"と表示され、 "ユニークなグローバルシンボル"のマニュアルページで呼び出されます)。手動でgnu_unique_objectシンボルを作成

問題は、コンパイラが任意の変数に対してこの種のシンボルを生成するにはどうすればいいですか?私は、この動作を得るために、クラス内のものをラップするのにうんざりしています。

+0

あなたが提供するリンクは、具体的にはロード可能なモジュール(別名共有ライブラリ)のために実装された動作について説明します。静的変数を使うつもりなのでしょうか?あなたは複数のコンパイルユニットについて話しますが、複数の共有ライブラリは話しません。もしそうでなければ、あなたは確かに物事を簡単にすることができます。最後にこれらの変数に期待される動作を教えてください。 – dim

+0

@dim共有ライブラリ用に実装されているかもしれませんが、gccはそれを使って私が記述した動作を実装しています。 –

+0

ファインですが、私はまだ理解していません。「静的な記憶変数を持つヘッダーに定義されたクラスメンバー関数」と言うとき。 「静的記憶域で定義され、あるクラスのメンバー関数の本体で宣言された変数」を意味しますか?または、「メンバ関数」と「静的記憶域を持つメンバ変数」の両方を含むクラスですか? – dim

答えて

0

ヘッダーファイルにグローバル変数を宣言すると、各コンパイル単位で異なる変数のインスタンスが生成されます。 externキーワードは、あなたが後にしているものです。このキーワードは、前方宣言のインスタンス化のように見えます。それは、その名前の変数が異なるコンパイル単位でインスタンス化され、リンク時に見つかるという約束として考えることができます。

MyTrueGlobals.h

extern int global_variable_1; 

MyTrueGlobals.cpp

int global_variable_1 = 0; 
+0

これはまさに私が避けようとしていることです。*質問で説明したことを行うことで、回避することは可能です。 –

+0

何を避けていますか? cppファイルを持っている必要がありますか?ここにあなたの質問を理解している人は誰もいません。上の@ dimのコメントはおそらくあなたの最善の策です、 'inline'キーワードの動作はあなたの後ろにあるようですが、(理解しているように)関数にしか適用できません。 – Jfevold

関連する問題