📅  最后修改于: 2023-12-03 15:41:56.701000             🧑  作者: Mango
__declspec(noreturn)
或 [[noreturn]]
- C++在 C++ 中,函数可以正常地返回值或异常,但是有时候我们需要在函数执行的某个时刻退出程序并且不再返回。为了实现这一点,C++ 引入了 __declspec(noreturn)
和 [[noreturn]]
两个关键字。
__declspec(noreturn)
__declspec(noreturn)
是 Microsoft Visual Studio 专有的关键字。在函数声明前面加上它会告诉编译器函数将不会返回。例如:
__declspec(noreturn) void my_exit() {
// 做一些必要的清理工作
exit(0);
}
这里的 my_exit
函数调用了标准库函数 exit
以退出程序。由于 my_exit
声明了 __declspec(noreturn)
,所以即使 exit
返回了值,编译器也不会生成警告。
请注意,如果一个声明了 __declspec(noreturn)
的函数返回了,编译器会产生一个警告。因此,你应该确保函数不会返回。
[[noreturn]]
[[noreturn]]
是 C++11 引入的。该关键字通常使用于函数声明的末尾,以告诉编译器该函数不应该返回。例如:
[[noreturn]] void my_exit() {
// 做一些必要的清理工作
exit(0);
}
使用 [[noreturn]]
与使用 __declspec(noreturn)
的效果是一样的。
下面是一个例子,展示了如何在 C++ 中使用 __declspec(noreturn)
或 [[noreturn]]
等关键字来退出程序并不再返回:
#include <iostream>
#ifdef _MSC_VER
#define NORETURN __declspec(noreturn)
#else
#define NORETURN [[noreturn]]
#endif
NORETURN void my_exit() {
// 做一些必要的清理工作
std::cout << "Exiting program..." << std::endl;
exit(0);
}
int main() {
std::cout << "Before my_exit" << std::endl;
my_exit();
std::cout << "After my_exit" << std::endl;
return 0;
}
这个程序声明了 my_exit
函数,并使用了 __declspec(noreturn)
或 [[noreturn]]
确保程序退出后不会再返回。在 main
函数中,调用 my_exit
函数退出程序。注意到 my_exit
函数的返回值类型是 void
,但是使用了 __declspec(noreturn)
或 [[noreturn]]
后,告诉编译器该函数将不会返回。在 main
函数中,即使在调用 my_exit
函数后仍然有一个 std::cout
语句,但是由于 my_exit
函数不再返回,这条语句绝不会被执行。
使用 __declspec(noreturn)
和 [[noreturn]]
可以帮助我们在 C++ 中实现程序的退出并告诉编译器该函数将不会返回。注意到这两个关键字只有在程序退出时才会发挥作用,而它们并不会改变我们的程序逻辑。