__declspec(noreturn)的用法

本文介绍了__declspec(noreturn)在C++中的应用,包括避免编译警告和错误、标记不会返回的函数,以及在自定义异常中使用。通过示例展示了如何避免因未处理的代码路径而产生的编译器警告。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

__declspec(noreturn)的用法

飘飘白云 2008.11.26
先来看noreturn在MSDN中的注解:

一个函数被 __declspec(noreturn)所约定,那么它的含义是告诉编译器,这个函数不会返回,其结果是让编译器知道调用约定为 __declspec(noreturn)的函数之后的代码不可到达。

如果编译器发现一个函数有无返回值的代码分支,编译器将会报C4715的警告,或者C2202的错误信息。如果这个代码分支是因为函数不会返回从而无法到达的话,可以使用约定 __declspec(noreturn)来避免上述警告或者错误。
Note注意:

将一个期望返回的函数约定为__declspec(noreturn) 将导致未定义的行为。

在下面的这个例子中,main函数没有从else 分支返回,所以约定函数fatal__declspec(noreturn)来避免编译或警告信息。

// noreturn2.cpp
__declspec(noreturn) extern void fatal () {}

int main() {
 if(1)
 return 1;
 else if(0)
 return 0;
 else
 fatal();
}
-----------------------------------------------------------
另一个用途就是在自定义exception的时候,可以用 __declspec(noreturn)来约定throw函数,因而可以在抛出异常的时候,让其后的语句不被执行。
示例:
  1. //Exception
  2. classException{
  3. public:
  4. virtual~Exception()
  5. {
  6. }
  7. };
  8. //Exception
  9. //LogicalError
  10. classLogicalError:
  11. publicException{
  12. CStringWm_Message;
  13. public:
  14. LogicalError(LPCWSTRmsg):
  15. m_Message(msg)
  16. {
  17. }
  18. virtual~LogicalError()
  19. {
  20. }
  21. LPCWSTRGetMessage()const
  22. {
  23. returnm_Message;
  24. }
  25. staticvoidDECL_NORETURNThrow(LPCWSTRmsg)
  26. {
  27. throwLogicalError(msg);
  28. }
  29. };
在使用的时候,就可以达到在调用throw之后,位于throw语句之后代码不会被执行。
比如:
LPCWSTR getString(FILE* fp)
{
if( fp == NULL) {
LogicalError::Throw(L"getString(FILE* fp):File handle fp is NULL!");
}
......
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值