快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

梦之城最新官方网站_throw()使用小结



为什么要加一个throw()到你的函数中?

这是异老例范,只会呈现在声明函数中,表示这个函数可能抛出任何类型的非常

void GetTag() throw(int)梦之城最新官方网站;表示只抛出int类型非常

void GetTag() throw(int,char);表示抛出in,char类型非常

void GetTag() throw();表示不会抛出任何类型非常

void GetTag() throw(...);表示抛出任何类型非常

void GetTag() throw(int);表示只抛出int类型非常

并不表示必然会抛出非常,然则一旦抛出非常只会抛出int类型,假如抛出非

int类型非常,调用unexsetpion()函数,退出法梦之城最新官方网站度榜样。

要是你加一个throw()属性到你的永世不会抛出非常的函数中,编译器会异常智慧的知道代码的意图和抉择优化要领。斟酌下面的代码:

class MyClass

{

size_t CalculateFoo()

{

:

:

};

size_t 梦之城最新官方网站MethodThatCannotThrow() throw()

{

return 100;

};

void ExampleMethod()

{

size_t foo, bar;

try

{

foo = CalculateFoo();

bar = foo * 100;

MethodThatCannotThrow();

printf(\"bar is %d\", bar);

}

ca梦之城最新官方网站tch (...)

{

}

}

};

当编译器看到梦之城最新官方网站这个带\"throw()\"属性代码的时刻,编译能够优化这个\"bar\"变量,由于它知道从MethodThatCannotThrow()函数中不会抛出任何的非常。假如没有这个throw()属性,编译器必须创建这个\"bar\"变量,由于要是MethodThatCannotThrow抛出了一个非常,这个非常句柄可能会必要寄托这个bar变量。

别的,象prefast源代码阐发对象能够(也会)用throw()注释去优化他们的差错检测能力----举个例子,要是你有一个try/catch而且所有调用的函数都已经标记了throw(),实际上你不必要这个try/catch(是的,要是你着末调用的函数可能抛出非常这就会有个问题了)。

您可能还会对下面的文章感兴趣: