問題タブ [static-initialization]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ での静的初期化順序の問題
これは古いテーマの別のバリエーションです。異なる翻訳単位での静的オブジェクトの初期化順序は定義されていません。
以下は、私の特定のシナリオの簡略化された例です。クラス G と F は非 POD タイプです。F が G に依存するということは、F のインスタンスを構築するには G のいくつかのインスタンスが必要であるという意味です (たとえば、F はアプリケーションが発行する何らかのメッセージであり、G のインスタンスはそのようなメッセージのコンポーネントである可能性があります)。
G.hpp
Gs.hpp
Gs.cpp
F.hpp
Fs.hpp
Fs.cpp
operator+
F のコンストラクターは、 G のインスタンスに適用した結果である引数を取り
ます。F と G の両方のインスタンスはグローバル変数であるため、F のコンストラクターが必要とするときに G のインスタンスが初期化されているという保証はありません。
ここでの特殊性は、あちこちに多くの G と F があることです。F が必要なときはいつでも G の構築を強制しながら、構文を上記のコードに可能な限り近づけたいと思います。
c++ - 派生クラスの静的初期化をオーバーライドできません
階層内のクラスにさまざまな静的初期化を提供しようとしていますが、このコードで試した場合:
私はこのビルドエラーで終わりました:
静的初期化は派生クラスでオーバーライドできないようですか?これが機能しない場合は、常にcomponentNameをconst char *を返す静的関数として定義する可能性があります。これに関する唯一の問題は、部分的な特殊化の初期化を行うことを望んでいたことであり、その方法はないようです。ほとんど同じままになる他のすべてのコードをコピーせずに、部分的な特殊化で1つの関数だけを再定義することを知っています。
spring - Bean の Spring 静的初期化
ねえ、Spring で静的初期化をどのように処理する必要がありますか? つまり、私のBeanには静的な初期化があります
そして、ErrorExceptionMapping が前にロードされるように注意する必要があります。私はこれを試しました:
しかし、私は得ました
静的な初期化を省略したり、Bean のメソッド内からメソッドを呼び出したりしても、もちろん問題ありません。ここでは、初期化コールバック (afterPropertiesSet()) は役に立たないと思います。
java - java static 内部クラスの初期化エラー
コンテキスト: java.io.File クラスには、次のような static 内部クラス メソッドがあります。
[いくつかのコードを追加するために編集] 以下の私のコードは、最終的に上記のコード行を呼び出します。temporaryDirectory() メソッド内から例外がスローされますが、これは私のコンテキストでは問題ありません/予想されます。
次に、同じメソッド (createTempFile) を再度呼び出すと、「java.lang.NoClassDefFound エラー - クラス java.io.File$LazyInitialization を初期化できませんでした」というメッセージが表示されます。
質問: 内部メソッドが例外をスローしたとしても、内部クラス LazyInitialization は、その静的メソッドが呼び出されたときにクラス ローダーによってロードされているはずだと思いました。しかし、2 回目の呼び出し時に NoClassDefFound エラーが表示されるのはなぜですか? 元の仮定は間違っていますか?
c++ - 配列を含む構造体の C++ 初期化
私は多かれ少なかれこのパターンに従う構造を持っています:
これらを次の構文のようなもので初期化できるようにしたいと思います。
実際、その初期化構文 (というか、そのコンパクトさ) は、特定の構造体レイアウトよりも重要です。標準のコンテナー (組み込みプラットフォーム) にはアクセスできませんが、必要に応じてそれらの動作の一部を再現できる可能性があります。
最終的には、これらの sTruct コンテナーの約 300 個の配列を一度に初期化し、括弧をもう 1 レベル追加します。
c - マルチスレッドコンテキストで静的変数を初期化する方法は?
関数内でのstaticキーワードの適切な使用法は、次のようになると思いました。
要するに、それはクリティカルセクションを作る良い方法のように思えます。私の質問は、スレッドセーフな方法でthreadLockを初期化するにはどうすればよいですか?私が恐れている例の問題は、ロックが複数回割り当てられ、各スレッドが異なるロックを使用することです。これを修正する方法について何かアイデアはありますか?鶏が先か卵が先かという問題のようです。pthreadとwindowsスレッドの両方で機能する1つまたは複数のソリューションが必要です。
編集:この機能が必要な理由は、シングルスレッドまたはマルチスレッド(デバッグ目的)のコードを実行するときに違いがあるかどうかをテストするための邪魔にならない方法を提供するためです。
c++ - ライブラリから参照されていない静的C++オブジェクトをgccにリンクさせる方法
共有ライブラリまたは静的ライブラリとして構築できるC++ライブラリを使用しています。このライブラリは、プログラムの起動時に静的オブジェクトが登録され、静的オブジェクトが作成されるファクトリ手法を使用しています。
共有ライブラリが使用されている限り、これは正常に機能します。静的バージョンを使用すると、静的オブジェクトはいずれも最終プログラムに含まれず(直接参照されないため)、そのため、それらの機能は使用できません。
リンク時にライブラリからのすべての静的オブジェクトをgccに強制的に含める方法はありますか?
ライブラリはオープンソースであり、それが役立つ場合は変更できます。
c - 静的 pthreads ミューテックスの初期化
pthreads を使用して、C でミューテックスの静的配列を初期化するにはどうすればよいでしょうか?
単一の静的ミューテックスの場合、PTHREAD_MUTEX_INITIALIZER を使用できるようです。しかし、それらの静的配列はどうでしょうか? たとえば、
それとも動的に割り当てる必要がありますか?
c++ - C++ で静的コンストラクターを模倣する
これは、C++ でのオブジェクトの初期化に関する質問です。
共通の基本クラスから継承するクラス (インスタンスではない) のグループがあり、プログラムの開始時にコンテナー (具体的にはマップ) に自分自身に関する情報を登録する必要があります。
問題は、動的にする必要があることです。コンテナーは、クラスとは異なる独立したプロジェクトで定義されます。ライブラリを使用する各プログラムのクラスのセットごとに、ライブラリの複数のハードコーディングされたバージョンを作成することは避けたいと思います。
これらのサブクラスのそれぞれに特別なクラスの静的インスタンスを用意して、そのコンストラクターに登録することを考えました。ただし、これらのオブジェクトの構築前にコンテナが構築されることを保証する方法は見つかりませんでした。
サブクラスに関するコンテナ内の情報は、これらのサブクラスのインスタンスが作成される前に利用できる必要があることにも注意してください。
これを行う方法、または一般的に C++ で静的コンストラクターを模倣する方法はありますか?
c++ - std::set をテンプレート化された静的メンバ変数として使用
私はフラグと呼んでいるJavaスタイルのEnumのようなものを作ろうとしています。要件は、各フラグが静的であるため、フラグが直接参照可能であり、各フラグがその名前の文字列を格納し、セット全体が反復可能でルックアップを助長することです。
フラグの各セットが個別に格納されるようにテンプレートを使用しています (したがって、各子クラスにセットを明示的に配置する必要がなくなります)。
プログラムの実行の成功または失敗は、フラグ宣言を含むオブジェクト ファイルのファイル名に依存するため、これは初期化の問題であると確信しています (Ao は segfaults ですが、Zo は正常に動作します)。
問題は静的な初期化順序の 1 つにあるようです。このコードは完全に正常にコンパイルされますが、実行すると gdb は次のようになります。
私のコードは次のとおりです。
アイテム.hpp
アイテム.cpp
初めての投稿なので、書式設定が間違っていたり、具体的でない場合はお知らせください。PS。不思議なことに、set を vector に置き換えると、set が特にポインターの挿入に問題があるかのように、動作するプログラムが得られます。これをテストするために、セットを int のセットに置き換え、クラスの初期化時に 0 を挿入しようとしましたが、これも同じエラーが発生しました。