2016-08-08 5 views

答えて

11

Q_ASSERTは、おそらく標準assert機能を強化するカスタムassertマクロです。

エラーメッセージは、qFatal()で処理されます。これは、標準のアサートマクロよりも若干優れた動作をする可能性があります。たとえば、Windows上では、アサーションが失敗した時点でVisual Studioデバッガを起動し、abort()を呼び出すだけで済みます。

あなたはまた、 Qtのエラーメッセージ機能の出力をリダイレクトすることができ、そのような(qInstallMessageHandler()付き)カスタムメッセージハンドラにqFatalとして。たとえば、エラーメッセージをファイルにリダイレクトする場合に便利です。これはあなたがQtの関連コードと残りの間アサート分離するために使用することができます。

はまた、(assertNDEBUGでは無効になっている間)Q_ASSERTマクロQT_NO_DEBUGで無効になっていることに注意してください。

+0

カスタムアサートマクロがどのように動作するのか、そしてそれらがなぜ有用なのかについての詳細な説明が必要な場合は、手をつけてください** Steve Rabinの_Game Programming Gems_ – Louen

3

QT_NO_DEBUGは、コンパイル時に定義された場合、それは何もしません。

ので、それについて考える:assertがあるようQ_ASSERTは、NDEBUGの不在に偶発的ではありません。 はassert()に何かを実行するために必要であり、ユーザ(およびライブラリ..?)のコードで他の一般的なデバッグ専用のものを区別するためによく使用されます。

別のマクロを使うと、NDEBUGを残しておかないとQt関連のものだけをデバッグしたいので、残りのコードをデバッグ専用のもので重み付けして、プログラムを膨らませます。NDEBUG特に定義されていない。assert()s。

あなたはリリースモードのセマンティクスで「通常の」ものをコンパイルしますが、まだQtのものにデバッグを適用したいのであれば、あなたはない-DQT_NO_DEBUG-DNDEBUGでコンパイルしたがことができます。

これは、複雑なGUIアプリケーションを開発する際には非常に便利です。私はQtを使用していませんが(まだですか?)、GTK +/gtkmmの選択したツールキットでこのようなものを使用することの利点を見ています[...確かに存在しますが、まだそれらを見ていませんでした;-)]

私は、直交提案の議論と織り交ぜ、ここではこれについての最近のアニメーションの議論を思い出す:ISO C++ Standard - Future Proposals › Exception stack trace information.

+0

はい私は別のデバッグが定義していることに気付きました。しかし、その可能性を持つことは理にかなっています。 – Zitrax

関連する問題