LD_PRELOAD を使用して他のコードの異なるバージョンにプリロードされるライブラリを作成しています (これは変更したくない/変更できません)。以前のバージョンでは、クラス A のクラス メソッド A::foo() が存在し、それ以降のバージョンでは存在しません。
グローバル (C ライク) 関数の場合、属性((weak)) メカニズムを使用して、コードの実行時に関数が実際に定義されているかどうかを確認しています。
void foo() __attribute__(weak));
if (foo) { foo(); }
それはクラスメンバーにはうまくいかないようです。
コンパイル時エラーは次のとおりです。
no ‘int somenamespace::SomeClass::someFunction()’ member function declared in class ‘somenamespace::SomeClass’
int somenamespace::SomeClass::someFunction() __attribute__((weak));
^
...
./file.cpp: In member function ‘virtual void somenamespace::OtherClass::initialize()’:
./file.cpp:397:32: error: ‘class somenamespace::SomeClass’ has no member named ‘someFunction’
num = theinstance.someFunction();
コンパイル時に既知の定義に依存しない存在をチェックする方法はありますか?
関数の存在を確認するためにテンプレートを作成することは可能ですか? のようにテンプレートを使用できません。I テンプレートはコンパイル中に評価されるためです。
また、関数が C/C++ に存在するかどうかを確認する方法は役に立ちませんでした。