4

关于这个的两个问题:

  • 有没有办法强制g++忽略说明throw符?
    (例如,我记得,Visual Studio 忽略了 throw 说明符,不同于throw()

  • 是否可以强制g++检查 throw 说明符是否正确 - 我的意思是检查(这可以通过一次性编译器完成)是否具有 throw 说明符的函数调用函数,这可能只是通过观看他们的 throw说明符注意执行throw异常,这会违反说明符吗?(注意:这不应该在没有 throw 说明符的情况下观看函数,因为这可能会导致大量警告)


编辑:我将为我的第二个问题添加一些示例。

假设我们有:

// 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++ 忽略 throw:

#define throw(x)

关于其余部分,您需要更改编译器代码或在构建过程中制作自己的脚本/程序来检查这些内容,可以使用正则表达式轻松完成。

编辑:

关于您的评论,找到异常的层次结构真的很容易。使用正则表达式,如:

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

并将其输入到哈希中,然后制作分层数据。
要匹配抛出异常的函数中的异常,请使用:

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

它没有经过测试,可能有一些错误,但是很好的起点

于 2011-05-18T12:05:57.757 回答