GCCには、を介してシンボルリンクを弱くする機能があり__attribute__((weak))
ます。ユーザーがアプリケーションでオーバーライドできる静的ライブラリの弱い記号を使用したいと思います。GCCスタイルの弱いシンボルでそれが可能になりますが、VisualStudioで実行できるかどうかはわかりません。
Visual Studioは同様の機能を提供しますか?
GCCには、を介してシンボルリンクを弱くする機能があり__attribute__((weak))
ます。ユーザーがアプリケーションでオーバーライドできる静的ライブラリの弱い記号を使用したいと思います。GCCスタイルの弱いシンボルでそれが可能になりますが、VisualStudioで実行できるかどうかはわかりません。
Visual Studioは同様の機能を提供しますか?
あなたはそれを行うことができます.Cの例を次に示します:
/*
* pWeakValue MUST be an extern const variable, which will be aliased to
* pDefaultWeakValue if no real user definition is present, thanks to the
* alternatename directive.
*/
extern const char * pWeakValue;
extern const char * pDefaultWeakValue = NULL;
#pragma comment(linker, "/alternatename:_pWeakValue=_pDefaultWeakValue")
MSVC ++には__declspec(selectany)
、弱いシンボルの機能の一部をカバーする機能があります。外部リンケージを使用して複数の同一のシンボルを定義し、コンパイラに使用可能ないくつかのシンボルのいずれかを選択するように指示できます。ただし、MSVC ++には、弱い記号機能の他の部分、つまりライブラリで「置き換え可能な」定義を提供する可能性をカバーするものはないと思います。
これは、ところで、MSVC++で標準の交換可能機能::operator new
と::operator delete
機能のサポートがどのように機能するのか不思議に思います。
MSVCは、シンボルが.objファイルと.libで定義されている場合、警告なしに.objファイルのシンボルを使用するように動作していました。シンボルが複数のライブラリで定義されている状況も処理し、リストの最初に名前が付けられたライブラリのシンボルを使用することを思い出します。
しばらくこれを試したとは言えませんが、この動作が変更された場合は驚きます(特に、.objで定義されたシンボルが.libファイルのシンボルをオーバーライドします)。
私が知っている唯一の方法。各シンボルを個別のライブラリに配置します。オーバーライドのあるユーザー オブジェクトもライブラリに結合する必要があります。次に、すべてをまとめてアプリケーションにリンクします。ユーザー ライブラリを入力ファイルとして指定する必要があります。ライブラリは/DEFAULTLIB:
オプションを使用してリンカーに転送する必要があります。
この属性に相当する MS-VC はありません。http://connect.microsoft.com/VisualStudio/feedback/details/505028/add-weak-function-references-for-visual-ccを参照してください。ここでその目的を読んでください: http://www.kolpackov.net/pipermail/notes/2004-March/000006.html本質的には、シンボルが存在する場合、関数を定義することです。使用されている、使用されていない、使用されていない、そう...
「これを行う必要がある場合」という大きな注意を払って、この目的のためにプリプロセッサを使用しないのはなぜですか? (私はプリプロセッサを推奨するのが好きではありません)。
例:
#ifdef USE_MY_FUNCTION
extern void function();
#endif
#ifdef
次に、ステートメントで囲まれたアプリケーション ロジックで適切に呼び出します。スタティック ライブラリがリンクされている場合は、リンク イン プロセスの一部として、定義を微調整して USE_MY_FUNCTION を定義します。
まったく同等ではなく、非常に醜いですが、私が考えることができる最高のものです.