4

これに関する2つの質問:

  • 指定子を強制的g++に無視する方法はありthrowますか?
    (たとえば、私が覚えているように、Visual Studio は とは異なり、スロー指定子を無視しますthrow())

  • スロー指定子が正しいかどうかを強制的g++にチェックすることは可能ですか?つまり、スロー指定子を持つ関数が関数を呼び出すかどうかをチェックすることです(これはワンパスコンパイラで実行できます)。指定子throw、指定子に違反する例外の実行を監視しますか? (注:大量の警告が発生する可能性があるため、スロー指定子なしで関数を監視しないでください)


編集: 2 番目の質問にいくつかの例を追加します。

次があるとします。

// sorry for the coding style here, but I don't want it to be unnecessary long
class A { /* .. */ };
class B : public A { /* .. */ };
class C { /* .. */ };
void no_throw_spec() { /* .. */ }
void no_throw_at_all() throw() { /* .. */ }
void throws_A() throw( A ) { /* .. */ }

// this is fine, don't do anything
void f() 
{ no_throw_spec(); no_throw_at_all(); throws_A(); }

void g() throw()
{ 
    no_throw_spec(); no_throw_at_all(); // OK
    throws_A();  // warning here - throws_A() may throw A, but g() has throw()!
}

void h() throw( A )
{
    no_throw_spec(); no_throw_at_all(); throws_A(); // OK
    if( /* .. */ ) 
        throw B(); // OK, B inherits A, it's OK
    /* .. */
    throw C();    // C does not inherit A, so WARNING!
}
4

2 に答える 2

3
  • gcc にはオプションがあります-fno-enforce-eh-specs。ドキュメントを参照して、希望どおりに動作することを確認してください。

  • gcc で例外仕様を静的にチェックする方法を覚えていません。

(動的) 例外仕様は C++0X では非推奨でありnoexcept、空の例外仕様のケースを置き換える例外仕様を追加することに注意してください (これも動的にチェックされ、テンプレートでの使用に役立つ規定があります)。

于 2011-05-18T12:37:34.563 に答える
2

はい、次の方法で g++ がスローを無視するようにすることができます。

#define throw(x)

コンパイラコードを変更するか、ビルドプロセスでそれらをチェックする独自のスクリプト/プログラムを作成する必要がある残りについては、正規表現で簡単に実行できます。

編集:

あなたのコメントについて、例外の階層を見つけるのは本当に簡単です。次のような正規表現を使用します。

class ([^ ]*) : ([^ ]*)

それをハッシュに入力し、後で階層データを作成します。
それらをスローする関数で例外を照合するには、次を使用します。

([^\(\s]*)[\s]*([^\)])[\s]*(throw[\s]*\([^\)]*\)){((throw[\s]*[^;])|*)*}

テストされていないため、エラーが発生する可能性がありますが、開始するのに適した場所です

于 2011-05-18T12:05:57.757 に答える