📌  相关文章
📜  退出:重新定义; '__declspec(noreturn)' 或 '[[noreturn]]' - C++ (1)

📅  最后修改于: 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++ 中实现程序的退出并告诉编译器该函数将不会返回。注意到这两个关键字只有在程序退出时才会发挥作用,而它们并不会改变我们的程序逻辑。