0

私は大きな C++ プロジェクトを持っています。このプロジェクトでは、他のライブラリのクラスを必要とするデバッグ機能を実装しようとしています。残念ながら、これらのクラスは、プロジェクト内で呼び出されるクラスと同じ名前と名前空間を共有しています。複数の定義を避けるために静的ライブラリを使用しようとしましたが、もちろんコンパイラはその問題について不平を言います。だから私の質問:コンパイラが関数内の呼び出されたクラスについて知らなくても、関数のライブラリを作成することは可能ですか?

「保護された関数」のように、またはライブラリからのすべてのコードを関数コード内に配置するように、わかりません..

編集: g++ コンパイラを使用しています。

マックス、私は知っていますが、今のところ他に方法がありません。

回路図、問題は。

計画:

#include a.h // (old one)
#include a2.h

return a->something();
return a2->something(); //debug function

デバッグ機能 a2:

#include a.h // (new one!!)

return a->something(); // (new one!)

これまでのコンパイルプロセスは次のようになります。

g++ project -la -la2

これは非常に単純化されたドラフトです。しかし、実際にはそれだけです。

4

3 に答える 3

3

おそらく、その外部ライブラリに内部的にリンクし、その定義を別の名前または名前空間でエクスポートするラッパー ライブラリを作成できます。

于 2012-06-14T16:44:11.547 に答える
1

デバッグ関数で使用しているクラスの宣言の #includes を名前空間で囲みますが、その名前空間に using 句を使用しないでください。

于 2012-06-14T16:44:42.153 に答える
0

役立つテクニックがいくつかありますが、それはライブラリの「デバッグ バージョン」が何をするかによって異なります。

#ifdefまず、プログラムがデバッグ モードでビルドされたかどうかに応じて、追加のチェックを行う関数内にブロックがあることは前代未聞ではありません。Cassertマクロはこのように動作します。

第 2 に、「デバッグ バージョン」はメッセージをログに記録するだけである可能性があります。デバッグ バージョンとリリース バージョンの両方にロギング コードを含めて、各ログ メッセージのある種の「優先度」パラメータに基づいて実際にログを記録するかどうかを決定するのは簡単です。

第 3 に、関数がオプションで特定のメソッドを持つパラメーターとしてオブジェクトを受け取ることができるイベント ベースの設計を使用することを検討できます。その後、興味深いことが発生し、関数にイベント オブジェクトが渡された場合、関数はそれらのメソッドを呼び出すことができます。

最後に、作業中のライブラリよりも下位レベルで何が起こるかに実際に関心がある場合は、それらの下位レベル ライブラリのデバッグ バージョンにリンクするだけです。これは、実際に作業しているライブラリとは異なるライブラリに適用された、上記の最初のオプションのケースです。Microsoft のランタイムライブラリは、Google のperftoolsや多くの「デバッグmalloc」ライブラリと同様に、これを行います。

于 2012-06-14T17:48:33.707 に答える