__declspec(noreturn)的用法
先来看noreturn在MSDN中的注解:
一个函数被__declspec(noreturn)所约定,那么它的含义是告诉编译器,这个函数不会返回,其结果是让编译器知道调用约定为__declspec(noreturn)的函数之后的代码不可到达。
如果编译器发现一个函数有无返回值的代码分支,编译器将会报C4715的警告,或者C2202的错误信息。如果这个代码分支是因为函数不会返回从而无法到达的话,可以使用约定__declspec(noreturn)来避免上述警告或者错误。
注意:
将一个期望返回的函数约定为__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函数,因而可以在抛出异常的时候,让其后的语句不被执行。
示例:
-
-
classException{
-
public:
-
virtual~Exception()
- {
- }
- };
-
-
-
classLogicalError:
-
publicException{
- CStringWm_Message;
-
public:
-
LogicalError(LPCWSTRmsg):
- m_Message(msg)
- {
- }
-
virtual~LogicalError()
- {
- }
-
LPCWSTRGetMessage()const
- {
-
returnm_Message;
- }
-
staticvoidDECL_NORETURNThrow(LPCWSTRmsg)
- {
-
throwLogicalError(msg);
- }
- };
在使用的时候,就可以达到在调用throw之后,位于throw语句之后代码不会被执行。
比如:
LPCWSTR getString(FILE* fp)
{
if( fp == NULL) {
LogicalError::Throw(L"getString(FILE* fp):File handle fp is NULL!");
}
......
}
分享到:
相关推荐
__declspec(dllexport)和__declspec(dllimport)的区别是什么
C++__declspec关键字详细用法
C++__declspec关键字详细用法[文].pdf
在win32sdk / c 命令行下用__declspec(dllexport)导出函数名字和全局变量.
c++ 中__declspec 的用法如下,想要了解的继续往下看吧。 语法说明: __declspec ( extended-decl-modifier-seq ) 扩展修饰符: 1:align(#) 用__declspec(align(#))精确控制用户自定数据的对齐方式 ,#是对齐值。...
c++中__declspec的用法.pdf
extern "C" __declspec(dllexport) bool TifOpen(char* filename,char* model); extern "C" __declspec(dllexport) bool TifClose(); extern "C" __declspec(dllexport) int GetTifWidth(); extern "C" __declspec...
关于C和C++的兼容问题 如果要写C和C++兼容的DLL,因为在C和C++下使用了不同的名字修饰规则以及不同的调用约定,所以,如果DLL是用C编写和编译的,则在
_CRTIMP __declspec(noreturn) void __cdecl unexpected(void); #else _CRTIMP void __cdecl terminate(void); _CRTIMP void __cdecl unexpected(void); #endif _CRTIMP terminate_function __cdecl set_terminate...
VC 利用关键字_declspec (dllexport)导出函数,编译后将生成Test.dll文件。。。参考价值更大于使用价值。欢迎下载。没有截图哦,因为只有一个DLL。
摘要:VC/C++源码,其它分类,关键字 VC++使用关键字_declspec (dllexport)导出函数,编译后将生成Test.dll文件。
return; } //1 __declspec(naked) void Direct3DShaderValidatorCreate9() { //跳转到 原来d3d9.dll Direct3DShaderValidatorCreate9 _asm jmp dword ptr [g_Call14+1*4] ; } //2 __declspec(naked) void ...
两篇关于hough forest and regression forest的论文阅读后写的ppt
动态库编译好了,提供dll,lib,.h.以及测试代码、只需要自己的训练的分类器,网络结构均值,类别就可以试用了
declspec(dllexport)与_declspec(dllimport)的区别