2011-11-16 2 views
6

は、このコードを見てみましょう:空 "リリース" ASSERTマクロがプログラムをクラッシュさせますか?

#include <cassert> 

#ifdef DEBUG 
#define ASSERT(expr) assert(expr) 
#else 
#define ASSERT(expr) 
#endif /* DEBUG */ 

をプログラムでは、それ以外の場合は、ハングアップしていない結果で終了します、私はDEBUGを定義した場合にのみ実行されます。私はEclipse Indigo CDTでMinGWを使用しています。アドバイスをいただければ幸いです!

答えて

7

あなたはほぼ確実にを罵倒するアサーションです。アサーション式には副作用があってはなりません

assert(initialize_critical_space_technology());と言って、リリースビルドでこの行全体を省略すると、何が起こるか想像することができます。これはおそらく最も秒です

#define VERIFY(x) (x)   // release 
#define VERIFY(x) (assert(x)) // debug 
8

問題の原因となっている実際のコードを見ずには分かりません。私の推測:副作用のある式をASSERT()の中で評価しています。例えば、ループ内にはASSERT(++i < someotherthing)があります。 NDEBUGビルドのマクロ定義を一時的にexprに変更することで確認できます。これが原因であることを確認したら、それぞれのASSERTコールにアクセスして、式が副作用なしであることを確認します。

+0

:一部の人々は何かをVERIFYマクロを導入

const bool space_init = initialize_critical_space_technology(); assert(space_init); 

常にコードを実行:

アサーションを使用するだけで、安全かつ健全な方法が値にありますデバッグビルドとリリースビルドの違いについての一般的な理由(最適化後)。 –

+0

お返事ありがとうございます、ただ1つの質問です。非デバッグのために '#define ASSERT(expr)(expr)'(Kerrek SBと同じように)を#定義し、そこからの副作用を心配するのは良い習慣でしょうか?私はこれが私のコードをより読みやすくすると感じています。 – AutoBotAM

+0

@AutoBotAM:代わりに 'ASSERT''を' VERIFY'と呼ぶなら、確かに進んでください。しかし、 'ASSERT'を再定義しないでください。人々は' NDEBUG'ビルドの表現を評価しないことを知っていて、期待しています。 –