質問

を利用した場合、 assert() との主張に失敗し assert()abort(), のプログラムを急.できませんが私の生産コードです。があるので、主張するランタイム時において未だにはっきり失敗した主張でチャンスが処理するのかということで優雅に?

役に立ちましたか?

解決

あり、事実はあります。する必要がありま習慣を主張する機能、C++'s assert() そのCの assert(), の abort() "機能"を同梱。幸いなことに、これは驚くほど簡単です。

を主張する.hh

template <typename X, typename A>
inline void Assert(A assertion)
{
    if( !assertion ) throw X();
}

上記の関数は例外をスローする場合述語にはありません。そのキャッチします。ない場合は例外をキャッチし、この例外, terminate() 呼ばれる、のプログラムと同様に abort().

ですから今の最適化を主張がしばしました。この場合、できる定数を定義することを意味するものだビルの生産とその定数です Assert().

debug.hh

#ifdef NDEBUG
    const bool CHECK_WRONG = false;
#else
    const bool CHECK_WRONG = true;
#endif

main.cc

#include<iostream>

struct Wrong { };

int main()
{
    try {
        Assert<Wrong>(!CHECK_WRONG || 2 + 2 == 5);
        std::cout << "I can go to sleep now.\n";
    }
    catch( Wrong e ) {
        std::cerr << "Someone is wrong on the internet!\n";
    }

    return 0;
}

の場合 CHECK_WRONG は一定の通話を Assert() 作成し離れた生産の場合においても主張しない一定の表現です。が何らかの不利であることを参考にして CHECK_WRONG またタイプがかかってこよう。も交流してゲインを活用した類することが可能である様々なグループの主張の有効/無効の切り替えのとしてフィット感を参照してください.したがって、例えばこのグループの主張というよりも生産コードを定義するグループの主張においてのみ行われるようにしたい見つけに開発構造を作成する環境が整いました

Assert() 機能は同等の入力

if( !assertion ) throw X();

その明示の趣旨-プログラミング:を表明。主張も容易になりまgrepのためにこのアプローチのように、平 assert()s.

詳しくはこの技術を見Bjarne StroustrupはC++のプログラミング言語3e部24.3.7.2.

他のヒント

ファイルのエラーレポート機能 アプローチを継続後を主張する.glibの基本となるプラットフォーム独立図書館がGnome(GTK)が利用します。ここでのマクロをチェックを前提と版画、スタックトレースの場合の前提条件と失敗します。

#define RETURN_IF_FAIL(expr)      do {                  \
 if (!(expr))                                           \
 {                                                      \
         fprintf(stderr,                                \
                "file %s: line %d (%s): precondition `%s' failed.", \
                __FILE__,                                           \
                __LINE__,                                           \
                __PRETTY_FUNCTION__,                                \
                #expr);                                             \
         print_stack_trace(2);                                      \
         return;                                                    \
 };               } while(0)
#define RETURN_VAL_IF_FAIL(expr, val)  do {                         \
 if (!(expr))                                                       \
 {                                                                  \
        fprintf(stderr,                                             \
                "file %s: line %d (%s): precondition `%s' failed.",     \
                __FILE__,                                               \
                __LINE__,                                               \
                __PRETTY_FUNCTION__,                                    \
                #expr);                                                 \
         print_stack_trace(2);                                          \
         return val;                                                    \
 };               } while(0)

この機能と版画のスタックトレース、環境を使用するgnuツールチェーン(gcc):

void print_stack_trace(int fd)
{
    void *array[256];
    size_t size;

    size = backtrace (array, 256);
    backtrace_symbols_fd(array, size, fd);
}

このようにのんのマクロ:

char *doSomething(char *ptr)
{
    RETURN_VAL_IF_FAIL(ptr != NULL, NULL);  // same as assert(ptr != NULL), but returns NULL if it fails.

    if( ptr != NULL )        // Necessary if you want to define the macro only for debug builds
    {
       ...
    }

    return ptr;
}

void doSomethingElse(char *ptr)
{
    RETURN_IF_FAIL(ptr != NULL);
}

主張のC/C++のみ実行にはデバッグ構造を作成する環境が整いましたならこんなことはないでしょう。一般を主張すべきであるものとなった場合は表示のバグは、一般的にショーの前提条件コードなど。

用いただけるコードチェックエラーでランタイム(発売)を使用例外ではなく主張していこうように設計されています。ご回答は基本的に包み込み例外throwerに主張する構文です。この仕事がみこしを見ただけで投げの例外。

ここでは、私は"主張する.h"(Mac OS10.4):

#define assert(e) ((void) ((e) ? 0 : __assert (#e, __FILE__, __LINE__)))
#define __assert(e, file, line) ((void)printf ("%s:%u: failed assertion `%s'\n", file, line, e), abort(), 0)

これにより、交換にabort()によりスロー(例).そのprintfできる形式の文字列の例外のエラーメッセージを表示します。最終的にできて思ったこと。

#define assert(e) ((void) ((e) ? 0 : my_assert (#e, __FILE__, __LINE__)))
#define my_assert( e, file, line ) ( throw std::runtime_error(\
   std::string(file:)+boost::lexical_cast<std::string>(line)+": failed assertion "+e))

いたコンパイルまでご利用いただけます。に意味があります。

注意:まれるようにする必要があり、"例外"ヘッダは付属の向の決定をした場合は、ご利用いたフォーマットエラーメッセージ).ができます"my_assert"機能だけを宣言するのに、その試作品です。のようなもの:

void my_assert( const char* e, const char* file, int line);

実装するかができる自由を含むすべてのヘッダがあります。

ラップであ#ifdefデバッグ請求-お問い合わせはこちらか、ない場合は常に走らせたいという方に確認をしています。

したい場合にスローを文字列についての情報を張http://xll8.codeplex.com/SourceControl/latest#xll/ensure.h

_set_error_mode(_OUT_TO_MSGBOX);

今回、この機能が役立ちます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top