0

「プラグイン」を名前で作成できるように、特定の「プラグイン」クラスがファクトリ クラスに登録される Visual Studio ソリューションがあります。これらのプラグインは、ファクトリとともに、静的ライブラリ プロジェクトに存在します。

登録は、揮発性の静的登録テンプレート クラスを介して行われ、それぞれが独自のプラグイン コンパイル ユニット内にあります (したがって、登録プロセスは各プラグインによって「実行」され、利用可能なプラグインの中心的な情報はありません)。

volatile static StaticPluginRegisterHelper<PluginClass> s_register;

しかし、問題は、PluginClass がコードの他の場所で逐語的に使用されていない場合、リンカがコードを最適化することを選択することです。つまり、上記の static は決して実行されません。

これは、コンパイラまたはリンカのバグのように思えます。静的は揮発性であると具体的に述べているためです (つまり、「触れないでください!」) :)

回避策は明らかに、上記の登録を、常に含まれていることがわかっているコンパイルユニットに移動することです。もちろん、それは機能します。ただし、それほどきれいではありません。

アイデア?

4

1 に答える 1

0

リンカーは気にしませんvolatile。シンボルが参照されていないと判断した場合、それはエビクションの候補になります。参照されていないシンボルへの参照を強制するには、/INCLUDElinker オプションを追加できます。これは、 を使用してソース コードに埋め込むこともできます#pragma comment(linker,"/include:_s_register")– IInspectable 2 月 23 日 13:11

于 2014-06-27T11:33:29.500 に答える