__declspec(noreturn)的用法
飘飘白云 2008.11.26
先来看noreturn在MSDN中的注解:
一个函数被 __declspec(noreturn)所约定,那么它的含义是告诉编译器,这个函数不会返回,其结果是让编译器知道调用约定为 __declspec(noreturn)的函数之后的代码不可到达。
一个函数被 __declspec(noreturn)所约定,那么它的含义是告诉编译器,这个函数不会返回,其结果是让编译器知道调用约定为 __declspec(noreturn)的函数之后的代码不可到达。
如果编译器发现一个函数有无返回值的代码分支,编译器将会报C4715的警告,或者C2202的错误信息。如果这个代码分支是因为函数不会返回从而无法到达的话,可以使用约定 __declspec(noreturn)来避免上述警告或者错误。
注意: |
---|
将一个期望返回的函数约定为 __declspec(noreturn) 将导致未定义的行为。 |
-----------------------------------------------------------
另一个用途就是在自定义exception的时候,可以用
__declspec(noreturn)来约定throw函数,因而可以在抛出异常的时候,让其后的语句不被执行。
示例:
- // Exception
- class Exception {
- public:
- virtual~Exception()
- {
- }
- };
- // Exception
- // LogicalError
- class LogicalError :
- public Exception {
- CStringW m_Message;
- public:
- LogicalError(LPCWSTR msg) :
- m_Message(msg)
- {
- }
- virtual~LogicalError()
- {
- }
- LPCWSTR GetMessage() const
- {
- return m_Message;
- }
- static void DECL_NORETURN Throw(LPCWSTR msg)
- {
- throw LogicalError(msg);
- }
- };
比如:
LPCWSTR getString(FILE* fp)
{
if( fp == NULL) {
LogicalError::Throw(L"getString(FILE* fp):File handle fp is NULL!");
}
......
}