問題タブ [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++ - 静的関数を介して静的メンバーにアクセスすると、静的初期化順序の大失敗が発生することはありますか?
この特定のコードは、静的初期化順序の大失敗を起こしやすいですか? つまり、B の静的メンバー関数にアクセスするときに、コンパイル単位 "B" の静的初期化が既に行われていると仮定できますか?
または、次のようなコードがありますか?
標準への参照を歓迎します。
c++ - 静的メンバーを強制的に初期化するにはどうすればよいですか?
このサンプルコードを考えてみましょう。
(イデオネにも。)
dummy
の具体的なインスタンス化が行われるとすぐに初期化されることを期待しFoo
ていBar
ます。この質問(および最後の標準引用)は、なぜそれが起こらないのかをかなり明確に説明しました。
[...]特に、静的データメンバーの定義が存在する必要がある方法で静的データメンバー自体が使用されない限り、静的データメンバーの初期化(および関連する副作用)は発生しません。
または(インスタンスがないため、コンストラクターのトリックがない)を使用せずに、またユーザーが何らかの方法でメンバーを明示的に指定する必要なしに、強制 dummy
的に初期化(効果的に呼び出すregister_
)する方法はありますか?派生クラスが何もする必要がないための追加のCookie。Bar
Foo
Foo
編集:派生クラスへの影響を最小限に抑える方法を見つけました:
ただし、派生クラスにはそれを行わなくてもよいのですが。:|
c++ - 静的メンバーの明示的な定義
このコードを考えてみましょう:
ここで、行AはWilmaクラスの静的int aを明示的に定義し(リンカーエラーを引き起こすためにコメントアウトされています)、それがないとリンカーは未定義の参照エラーを出します(Wilma :: iが実際に使用されているため、使用しない場合はリンカーエラーはありません)ある。)
Fredクラスの静的Wilmawilma_についても同じことが言えます。つまり、B行のコードでも使用されているため、明示的に定義する必要があります。ただし、そうではない場合、Fred::wilma_のリンカーエラーはありません。明示的に定義されていません。なぜ?gcc4.5.2でテスト済み
編集: 私はどういうわけかこれについて別の疑問を持っています...
LINECとLINEBint Wilma::i
はどちらも、それぞれクラスの静的オブジェクトを使用しようとしていますWilma Fred::wilma_
。しかし、の定義だけint Wilma::i
が必須ですか?
なぜWilma Fred::wilma_;
必須ではないのですか?
行Bはノーオペレーションであるという答えを理解しています。でもC線についても同じことが言えますか?
android - Androidでのグローバル初期化
開発者が使用する前にアプリケーションIDで初期化する必要があるjarファイルとして配布されているライブラリコードを書いています。初期化は、次のような単なる関数呼び出しです。
トリッキーなことは、この初期化呼び出しを行うように開発者に指示する方法がわからないことです。最初は、メインアクティビティの単一の静的初期化ブロックが最も簡単な方法だと思いました。問題は、ユーザーが他のアクティビティまたはインテントを介してアプリケーションに入る可能性があり、メインアクティビティが読み込まれないことです。アプリケーションの起動方法に関係なく、アプリケーションの起動時にコード行が実行されるようにする一般的な方法はありますか?
初期化呼び出しはべき等であるため、使用できるすべての場所でこの初期化呼び出しを行うように人々に指示することができますが、それは面倒です。
java - Singleton 実装における Initialize-On-Demand イディオムと単純な静的初期化子
静的初期化を使用してスレッドセーフなシングルトンを実装する場合、Initialize-On-Demand イディオムは本当に必要ですか、それともインスタンスの単純な静的宣言で十分でしょうか?
静的フィールドとしてのインスタンスの簡単な宣言:
対
Brian Goetz がこの記事で最初のアプローチを推奨しているため、私はこれを尋ねます。
http://www.ibm.com/developerworks/java/library/j-dcl/index.html
この記事では後者を提案していますが、
http://www.ibm.com/developerworks/library/j-jtp03304/
後者のアプローチには、前者にはない利点がありますか?
c++ - 「最初の使用で構築する」イディオムはどのような状況でも失敗する可能性がありますか?
静的ライブラリを使用してプログラムを構築しています(実際にテストします)。
このライブラリには、次のような関数を含む1つのファイルが含まれています。
次に、main.cpp(ライブラリの外)で次のことを行っています。
そして、私はこの出力を取得します:
したがって、関数の2番目の呼び出し(ただし、ライブラリ内にある別のファイルから実行)は、以前の値をクリアするか、再初期化するか、独自のコピーを使用するように見えます。
GetString関数を「new」を使用するように変更しましたが、結果はまったく同じです(ところで、プログラムがクラッシュすることはありません)。
しかし、私はそれが可能であるかを理解していませんか?
私が間違っていることについて何か考えはありますか?
- - - - - - - - - - - - - - - - アップデート - - - - - - - - - ------------
- テストはシングルスレッド環境で行われます。
- 一部のプラットフォームでは動作し、一部では動作しません(Windows、MacOS、AIXで動作し、Linux、HP_UX、Solaris、FreeBSDでは動作しません...)
- 実行中にstrFilenameのアドレス(GetString内のprintf)を確認しましたが、重複のない1つの変数のように見えます(アドレスは常に同じです)
- しかし、最後のライブラリにnmがあると、次のようになります。
0000000000000030 T _Z16GetLogprintfFilev
0000000000000008 b _ZGVZ16GetLogprintfFilevE16strLogprintfFile
0000000000000018 b _ZZ16GetLogprintfFilevE16strLogprintfFile
U _Z16GetLogprintfFilev
そして、ベースライブラリ(final libで使用)にnmを使用すると、次のようになります。
0000000000000030 T _Z16GetLogprintfFilev
0000000000000008 b _ZGVZ16GetLogprintfFilevE16strLogprintfFile
0000000000000018 b _ZZ16GetLogprintfFilevE16strLogprintfFile
java - 「after():staticinitialization(*)」の@AspectJ構文
インスタンス化モデル内のpertypeを使用してトレースアスペクトを実装しようとしています。このようにして、タイプごとにクラスごとに1つのロガーを使用できるようになります。
私たちの周りのいくつかの例から、ロガーを初期化するためのこのコードを見つけることができます:
残念ながら、これを@AspectJ構文に完全に変換することはできません(これは私の制御外のプロジェクト要件です)。特に、ロガーをセットアップしてそのコードを1回だけ実行する必要がある部分です。
これは可能ですか?
ありがとう、
android - Androidライブラリから非ライブラリコードを呼び出す
Androidがライブラリプロジェクトを導入して以来、アプリをライブラリに変換して、適切な調整を加えた複数のバージョンを作成できるようにしています(たとえば、同じコードベースを使用する無料バージョンとプロバージョンですが、いくつか変更があります)。
最初は、ライブラリプロジェクトのコードがサブプロジェクトのフィールドにアクセスできるようにするのに問題がありました。言い換えれば、私の無料バージョンとプロバージョンにはそれぞれ、ライブラリプロジェクトが特定の機能を区別するために使用する、いくつかの定数を含むクラスがありました。
サブプロジェクトでは、ライブラリのメインアクティビティを拡張し、リフレクションを使用してライブラリ内のフィールドの値を変更する静的初期化ブロックを追加しました。
このコードでは、ConstantsHelperがライブラリにあり、サブプロジェクトからConstants.classを提供しています。これにより、ライブラリプロジェクトの定数が初期化されます。
私のアプローチは、1つの特定のユースケースを除いて、うまく機能します。アプリがしばらく使用されておらず、OSによって「停止」されている場合、ConstantsHelperの静的フィールドは忘れられます。
定数は(上記のように)メインアクティビティによってリセットされることになっていますが、OSが別のアクティビティを再開するため、メインアクティビティは起動されません。この結果、定数の初期化が忘れられ、再開されたアクティビティがライブラリ(サブプロジェクトの知識がない)にあるため、定数を再初期化できません。
ライブラリ内の他のアクティビティに、再開時にサブプロジェクトからコードを呼び出すように「指示」するにはどうすればよいですか?または、サブプロジェクトの一部のコードが履歴書ごとに呼び出されるようにする方法はありますか?
c++ - C++ は定数静的メンバーの初期化を遅らせることは可能ですか?
Qt を使用していますが、これは一般的な C++ の質問です。私の場合は単純Constants
です。特定の関数呼び出しが行われた後に初期化する定数静的メンバーを持つクラスがあります。
定数.h
定数.cpp
main.cpp
コンパイルすると、次のようになりました。
QCoreApplication::applicationFilePath: 最初に QApplication オブジェクトをインスタンス化してください
したがって、ここでの問題は明らかです。QApplication の静的関数が Constants.cpp で呼び出されると、QApplication は Qt によってまだインストールされません。QApplication a(argc, argv);
main.cppで行が渡されるまで何とか待つ必要があります
それは可能ですか?そうでない場合、これを克服するために他に何を提案できますか?
ありがとう
c# - C# のコレクション初期化子
Java では、List を作成し、静的初期化子を使用してすぐに入力できます。このようなもの:
その場でリストを作成し、それを引数として関数に渡すことができるので、これは便利です。このようなもの:
私はC#が初めてで、これを行う方法を理解しようとしていますが、空になります。これはC#で可能ですか? もしそうなら、どうすればそれを行うことができますか?