_Noreturn 关键字和 noreturn 宏 (C11)

_Noreturn 关键字在 C11 中引入。 它告知编译器,应用编译器的函数不返回调用方。 编译器知晓调用 _Noreturn 函数后的代码是不可访问的。 不返回的函数的一个示例为 abort。 如果控制流有可能返回调用方,则函数不能具有 _Noreturn 属性。

该关键字通常通过 <stdnoreturn.h> 中提供的便捷宏 noreturn 来进行使用,该宏映射到 _Noreturn 关键字。

使用 _Noreturn(或等效的 noreturn)的主要好处是在代码中明确函数的意向,便于将来的读者了解,以及检测意外产生的无法访问的代码。

标记为 noreturn 的函数不应包括返回类型,因为它不会将值返回给调用方。 它应为 void

使用 noreturn 宏和 _Noreturn 关键字的示例

下面的示例演示了 _Noreturn 关键字和等效的 noreturn 宏。

如果使用可以忽略的宏 noreturn,则 IntelliSense 可能会生成虚假错误 E0065。 它不会阻止你运行该示例。

// Compile with Warning Level4 (/W4) and /std:c11
#include <stdio.h>
#include <stdlib.h>
#include <stdnoreturn.h>

noreturn void fatal_error(void)
{
    exit(3);
}

_Noreturn void not_coming_back(void)
{
    puts("There's no coming back");
    fatal_error();
    return; // warning C4645 - function declared with noreturn has a return statement
}

void done(void)
{
    puts("We'll never get here");
}

int main(void)
{
    not_coming_back();
    done(); // warning c4702 - unreachable code

    return 0;
}

要求

必需的标头
noreturn <stdnoreturn.h>

另请参阅

/std(指定语言标准版本)
/W4(指定警告等级)
C4702 警告
__declspec(noreturn)