ヘッダーファイルのみで構成されるライブラリを開発しています。これまでは、クラスだけが含まれていましたが、これはうまくいきました。しかし、私は、いくつかの関数の実装のために、ライブラリー全体にアクセス可能な不変のデータ(つまり、クラス・インスタンス・データではない)をライブラリーに持っていなければならないことがあります。明らかに、ヘッダーファイルにグローバルデータを置くことはできません。そうでなければ、ヘッダーにシンボルの定義があり、リンク時に複数の定義エラーが発生するすべてのコンパイル単位を入れることはできません。ヘッダー専用ライブラリの静的データ
関数に変数static
を作成し、そのデータへのポインタを返すだけで、コンパイル単位をライブラリに追加することなくクラスに静的データを持たせることができる回避策が見つかったようです。
class StaticData {
public:
void doSomething() { /* this uses getData */ }
void doSomethingElse() { /* this does too */ }
private:
static int* getData() {
static int array[] { 1, 2, 3, 4 };
return array;
}
};
これは正常に動作しているように見えるが、私はヘッダファイルにinline
機能でstatic
データを機能 - するために何が起こるか分からないということを認めなければなりません。私は、この "ハック"には、array
という独自のバージョンを取得しているこのコンパイル単位のような、意図しない影響があるかどうか疑問に思っています。コンパイラはどこにどのように配置するのですか?
また、私はシングルトンの反パターンなどを実装するためにこれを使用していないことに注意してください。私はちょうど複数の関数を使用する必要があるデータを格納するために使用しています(これはなぜそれを使用する関数でstatic
にすることはできませんが、そうしても、同じ質問を促すでしょう)。
ああ、それが救済です。私はこれがC++ 11と同様にC++ 03にも当てはまると仮定していますか?これは私の質問に実用目的で答えるが、面白いことに、コンパイラがどのようにデータ/関数定義を置くかを決定する方法に関するインプリメンテーションに依存しない情報はあるか? –
C++ 03の表現はまったく同じです。私は、コンパイラが、インライン関数とその静的なローカルのシンボルにフラグを設定したり、特別なセクションに置いたりして、見つかった最初のオカレンスをインクルードして重複を破棄するようリンカーに指示します。しかし、私はそれについての詳細を知らない。 –