私はC++の関数debugPrint(int foo)を持っているとします。どのようにすれば、リリースビルドから最も簡単に取り除くことができますか?私は#ifdefsでdebugPrintを呼び出す際に、本当に時間がかかるので、それを囲む必要はありません。一方、私は、コンパイラがその関数へのすべての呼び出しを取り除き、リリースビルドからの関数自体を100%確実に除去したいと考えています。ストリッピングは、関数呼び出しの結果として呼び出されたパラメータでも呼び出されます。たとえば、debugPrint(getFoo());その場合、私はgetFoo()呼び出しを取り除きたい。関数のインライン展開はオプションになる可能性があると理解していますが、インライン展開はサポートされているとは限りません。C++でコンパイル時にデバッグコードを取り除く方法は?
答えて
使用conditinalコンパイルおよびマクロ:
#ifdef _DEBUG
#define LOG(x) debugPrint(x)
#else
#define LOG(x)
#endif
デバッグビルドの_DEBUG
を定義し、リリースビルドのためにそれを定義しません。今すぐリリースビルドで
LOG(blahbhahblah);
は空の文字列に展開されます。パラメータは評価されず、放出されるコードには含まれません。
デバッグビルドで定義され、_DEBUG
の代わりにリリースで定義されていない既存のプリプロセッサシンボルを使用できます。
ええと..まさに何のマクロがありますか? – Newtopian
これは危険でエラーが発生しやすいです。 'int x = 0; LOG(x + = 2); use(x); 'は、" release "または" debug "モードがオンになっていると、動作が異なります。 – LiraNuna
はい、そうです。この世界では何も無料ではありません。 – sharptooth
にすべてのデバッグ行を削除します基本的に
#ifndef DEBUG
#define debugPrint
#endif
、および関数内のように、#1 IFDEF年代を持っている:オプティマイザは取り除くことができます
inline void debugPrint(whatever_t wtvr)
{
#ifdef DEBUG
Logger::log(wtvr);
#endif
}
その方法コードをきれいに保ちながら空の関数を呼び出します。
これは、関数パラメータが評価されないことを保証しますか? – sharptooth
これは他の要件には役立ちません(wtvrを計算するために評価する必要のあるコードが生成されない場合) –
@sharptoothこれらは、この解決策で評価する必要があります。しかし、評価がプログラムの動作(つまり副作用)を変更した場合、ロガー機能を呼び出すだけでロギング以上のことができるという問題があります。 – strager
#ifdef _DEBUG
#define debugPrint(x) _debugPrint(x)
void _debugPrint(int foo) {
// debugPrint implementation
}
#else
#define debugPrint(x)
#endif
@シャープトゥースの答えが良いです。
#ifndef NDEBUG
#define LOG(x) debugPrint(x)
#else
#define LOG(x)
#endif
NDEBUG
マクロが定義されている場合、その後:私は正常に作る一つのマイナーチェンジでは、しかし、デバッグマクロが定義されてある場合NDEBUG
マクロが定義されてないある場合は、デバッグを無効にするのではなく、することです前提条件や事後条件のようなものを宣言するのに、あるいは複雑な論理の結果を明確にするのにも、私はかなり自由に使う傾向がありますが、コンパイルからも脱落してしまいます。C assert
これは、 "no debugging"の標準マクロです。また、NDEBUG
マクロは、リリースビルドですでに定義されている必要があります。
参照:http://www.opengroup.org/onlinepubs/009695399/functions/assert.html
- 1. C++で-0を取り除く方法
- 2. C++でコンパイルするときに `restrict`キーワードを取り除くマクロ
- 3. C#からロボコメントと#regionを取り除く方法は?
- 4. OS XバイナリからObjective-Cシンボルを取り除く方法は?
- 5. RecyclerViewでロングスクロールを取り除く方法
- 6. C++でベクトルの空白を取り除く方法
- 7. C言語で503例外を取り除く方法#
- 8. コンパイル/縮小プロセス中にJavaScriptで不要なデバッグコードを取り除くにはどうすればよいですか?
- 9. リリースコードよりも実行時間が数桁長くなるデバッグコード
- 10. Circosのヒストグラムグリッドを取り除く方法
- 11. postgresqlのノイズを取り除く方法
- 12. displaytagランタイムエラーを取り除く方法
- 13. Instagram with BeautifulSoupを取り除く方法
- 14. コインスライダーのオートスクロールを取り除く方法
- 15. glClear(GL_STENCIL_BUFFER_BIT)を取り除く方法
- 16. UIWebViewのページローディングホイールを取り除く方法
- 17. EXC_BAD_ACCESSを取り除く方法
- 18. ボタンボーダーを取り除く方法
- 19. ヘッダーエラーを取り除く方法
- 20. border nivoスライダーを取り除く方法
- 21. Drushのインストールを取り除く方法
- 22. libthread_dbを取り除く方法
- 23. URL変数を取り除く方法
- 24. Flurryを取り除く方法
- 25. デバッグランタイムDLLを取り除く方法
- 26. エラーC3861を取り除く方法:?
- 27. アンドロイドでedittextを隠すと、スペースを取り除く方法は?
- 28. いくつかのステートメントのコンパイルを取り除く
- 29. CSSでイメージ間のスペースを取り除く方法は?
- 30. クリップで延長後のIDを取り除く方法は?
'からgetfoo()' 'でdebugPrint(からgetfoo())を除去する唯一の方法は、 'マクロを使用することです。しかし、それはあなたがプログラムがデバッグとリリースの設定において異なって振る舞うという点で、それにつながります。これは本当に危険です。 –
getFoo()が変数fooの値を取得する以外にいくつかの隠されたロジックを持っていると危険です。しかし、それは悪いコーディングです。 – juvenis