0

私が理解しているように、main()呼び出し前に作成したグローバル変数(クラス)がいくつかあります。グローバルなもののリストにデータを追加するか、コードの任意の部分からそのクラスのメンバーとしてデータを追加するための何らかの手法が必要であり、リンカーの前にデータを入力する必要があります。グローバルに作成されたクラス内で使用します。出来ますか?同様の解決策や質問すら見つかりませんでしたので、助けていただければ幸いです。

詳細な例:

コンストラクターに入力された変数を持つシングルトンクラスがあります。他のすべてのクラスは、実行時にクラスのデータを使用します。シングルトンクラスは、main関数の先頭に作成されます。私はさまざまなプロジェクトでシングルトンを使用しています。このデータは、このモジュールの要件を示す必要がある特別なフラグを除いて、すべてのプロジェクトとモジュールでほぼ普遍的です。シングルトンスロー例外プログラムが終了し、シングルトンがメインの最初の行で作成するため、実行の最初のステップでそれがわかっている場合。したがって、シングルトンにはすべてのプロジェクトのユニバーサルデータがたくさんありますが、各モジュールに必要なデータをシングルトンにポイントするフラグを追加する必要があります。mainのテンプレートを作成したので、プロジェクトごとに同じmainを使用し、後でPROJECT_NAMEを定義するだけです。

この説明は完璧に見えません。理解できない場合は、遠慮なく言ってください。もっと慎重に整理します。

編集:

私はまだインターネットで解決策を探していて、constexprが必要なもののように見えることがわかりましたが、現時点ではすべてのコンパイラでサポートされているわけではありません。回避策はありますか?

4

2 に答える 2

1

最初のステップは、グローバル変数を使用するのではなく、代わりにグローバル関数内で静的変数を使用することです。関数が初めて呼び出されると、変数が初期化され、関数は変数への参照を返します。

my_class& instnace() {
   static my_class i;
   return i;
}

リストの例:

std::list<my_class>& global_list() { 
   static std::list<my_class> m; return m;
}


static int x = []()->int{ global_list().push_back(my_class); return 0;}();
于 2012-07-29T15:00:01.803 に答える
0

さまざまなモジュールから目的を達成したい場合、1つの方法は、dllがロードされたときに何らかのコールバック関数を実行することです。

1つのウィンドウはDLLMainです。

ダイナミックリンクライブラリ(DLL)へのオプションのエントリポイント。システムがプロセスまたはスレッドを開始または終了すると、プロセスの最初のスレッドを使用して、ロードされた各DLLのエントリポイント関数が呼び出されます。また、システムは、LoadLibrary関数とFreeLibrary関数を使用してDLLがロードまたはアンロードされるときに、DLLのエントリポイント関数を呼び出します。

gccを使用する他のプラットフォームでは、[属性コンストラクター]で取得できます。

コンストラクターコンストラクター属性を使用すると、実行がmain()に入る前に関数が自動的に呼び出されます。同様に、デストラクタ属性により、main()が完了した後、またはexit()が呼び出された後、関数が自動的に呼び出されます。これらの属性を持つ関数は、プログラムの実行中に暗黙的に使用されるデータを初期化するのに役立ちます。これらの属性は現在、Objective-Cには実装されていません。

警告

この方法で自分の足を撃つのはとても簡単です。少なくとも、 dllエントリポイントでは実行できないことがたくさんあるウィンドウでは。制限事項については、コンパイラ/OSのドキュメントをお読みください。

于 2012-07-29T15:27:33.003 に答える