質問
C、C++ assert
は 非常に ヘビー級チを書き込むときのエラー stdout
および解除のプログラム。当社の申請をしてもらいたいかにより強固な交換のための主張とで自らをクリックします。べくあらゆる努力がなされた交換 assert
当社では、マクロしかしまだまだ多くの assert
復帰できることを視野(例えば、内部の第三者図書館、簡単な注入等)
他のご提案を低減することができま限定したものを根絶の利用 assert
?最良の答えが一つのコンパイラでキャッチボールいただき本当にありがとうございまいbabysitのコードベースとしています。
解決
私は本当に実際に、問題を理解していません。彼らはオフに行く場合は、例外状況で、今しているので、とにかく細かいである、唯一の高価なものをアサートします。
assert
だけデバッグビルドで有効なので、サードパーティのライブラリのリリースビルドを使用しています。しかし、実際に、すべての瞬間をオフに行くべきではありませんアサートます。
他のヒント
(スタックトレースを提供するために、コアダンプ、知っている)ビルトインアサーション機能を改善するために便利です。あなたは問題あなたが(または任意の「代わりassert()
利用SUPER_ASSERT()
の」のように)持っているどんな基準に従うためにあなたの開発者を取得を抱えている場合はその場合は、あなただけ控え、コンパイラのランタイム・ディレクトリのインクルードパスに独自のassert.h
ヘッダを置くことができますヘッダの。
これは標準assert()
マクロを使用して、誰もが(やるあなたはassert.h
ヘッダを持っているものに応じて)コンパイラエラーを取得したり、あなたのアサーション機能を取得することはかなり多くの保証をよ。
それはあなたが変更しているものに(少なくとも部分的に)依存することになります。あなたは、通常のメッセージをプリントアウトし、それを気にしないと仮定すると、ほとんどabort()
を呼び出してそれを取り除くしたい、あなたは一人でassert()
を残して、代わりにabort()
の独自のバージョンを定義することを検討可能性があります。
理論的には、それを行うことは移植性がありません - しかし、現実には、abort()
は標準ライブラリではかなり正常な機能で、あなたの代わりに独自にリンクしている場合、あなたはその動作を取得します。時々(特に一部のMicrosoftリンカー)、あなたはあなたに彼らのabort()
を置き換えるに協力するようにリンカーを得るために仕事のビットをしなければならないが、それはめったに非常に難しいません。
行きたいという問題は完全に有効になります。の場合を実施独自のエラーの取扱い:
- 常にトリガを主張でもリリース構造を作成する環境が整いました
- 継エラーを報告す場合の主張をトリガーとする。また送信エラー報告書または書き込みログファイルです。
うすればいいのかと思いますか解決するものです。
運がよければ、サードパーティーのライブラリの使用を主張するマクロまで自分自身を再定義して、ファイルを定義する本マクロはある種の
#pragma once
または#ifndef __HEADERFILE_H__ #define __HEADERFILE_H__
提供数が可能となるのである。のヘッダファイルを別途、再定義を主張します。れば、直接などを主張する.hまたはcassertきパッチコードによるものだと考えられます。を最小限のコードを変更して保存し、変化としてのパッチファイルを更新する際は、図書館のパッチだ。追加パッチのバージョン管理。
でいない場合は、再考の場合も内部を主張するサードパーティーのライブラリ.船舶のリリースのビルドのみのこくの主張は、追加のご主張をチェックのための正確性内のコードです。妥当性を確認の戻り値です。場合は、このような主張が起こることはできますが、第三者コードをどの問題です。
私は質問が有効だと思います。
私の非常に自身のアサートがブレークポイントに相当しますトリガ場合(「INT3」)、ASMに展開されます。私はまた、単純な終了よりデバッグのためのそれは非常に多くの有用であることが分かっています。
私は単にそれをいわゆる "ASSERT()" ではなく、通常の "アサート()" とは全くのassert()の使用を避けます。
最も明白なアプローチは、assert()
若干異なる独自の名前を主張する独自のバージョンを与えるように思われます。その後あなたは、テキストを検索文字列リテラル「_assert」のために、などのリンカメッセージ、を見て、あなたがそれを見たとき、あなたは問題が知ることができます。
私自身のコードでは、私はいつも、アサーションを行い、またはリリースビルドのためにAssert()
に拡張私自身の機能に展開((void)0)
を、使用しています。コンパイラは何に((void)0)
式を向けるだろうが、それはまだ表現としてカウントされます。このように
Assert(3 == x);
タグに変わります
((void)0);
とセミコロンが行く場所を持っています。
ちなみに、私は一度アサートは、特別なGUIモーダルポップアップダイアログたGUIアプリケーション上で働いていました。 、無視永遠に無視、またはブレーク:あなたは3つの選択肢を持っていました。アサートを無視して実行し続けるだろう無視します。フラグを設定します永遠に無視して、デバッガでプログラムを再起動するまで、そのアサートはもう発生しませう。ブレークがアサートデバッガに侵入することができるようになります。
私は、彼らがそれぞれアサートは独自の旗を持っていたことを保証する方法を覚えていません。あなたが書いたときたぶんアサート()を使用すると、一意の整数を指定する必要がありました呼び出しますか?それはそれよりも自動だった場合、それはいいだろう。私は、実際のimplmentationは、ビットベクトルがあったことをかなり確信している、とあなたは永遠に無視選んだときには、ビットを設定します。
assert()
が通常であると#define
'dさ((ボイド)0)のリリースコードの(#define NDEBUG
)、全てでのオーバーヘッドするが存在しないようにします。
、テストのためにあなたの能力を傷つけパフォーマンスのオーバーヘッドが現実的になることです?
あなたは、サードパーティのコードが最も可能性の高い「標準」assert
行動の仮定の下で書かれているという事実が欠けているように見えます。即ちコードは、プログラムが失敗したアサーションに終了する予定です。アサート状態が壊れている場合、通常、アサーションを次のコードでは、正しく動作しませんすることはできません。 100のうち99例では、それはまったく動作しません。それは単にクラッシュします100のうち99例において、即ちプログラムがとにかく終了します。
サードパーティのコードでassert
の動作をオーバーライドすることにより、あなたが何らかの形でプログラムを長生きさせると確信していするには最高の状態でナイーブである。
ソースコードがあなたのコントロール下にある場合:
#define NDEBUG
// Before
#include <assert.h>
// Or other header that includes assert.h
またはプリコンパイル済みヘッダーを使用して、またはNDEBUG
を定義するオプションをコンパイルします。
は、第三の部分バイナリの、それらのリリースバージョンを使用します。
ライブラリヘッダ内assert
(彼らはあなたのファイルシステム上の実際のファイルだと仮定)を検索し、無効なものと交換してください。
// #define assert(condition) ... /* old definition */
#define assert(condition) ((condition) & "PLEASE DO NOT USE ASSERT" = 42)