从使用 Noreturn 或 noreturn 函数说明符声明的函数返回

Version >= C11

函数说明符 _Noreturn 是在 C11 中引入的。头文件 <stdnoreturn.h> 提供了一个宏 noreturn,它扩展为 _Noreturn。因此,使用 <stdnoreturn.h> 中的 _Noreturnnoreturn 很好并且相当。

使用 _Noreturn(或 noreturn)声明的函数不允许返回其调用者。如果此类函数确实返回其调用者,则行为未定义。

在以下示例中,func() 使用 noreturn 说明符声明,但它返回其调用者。

#include <stdio.h>
#include <stdlib.h>
#include <stdnoreturn.h>

noreturn void func(void);

void func(void)
{
    printf("In func()...\n");
} /* Undefined behavior as func() returns */

int main(void)
{
    func();
    return 0;
}

gccclang 为上述程序发出警告:

$ gcc test.c
test.c: In function ‘func’:
test.c:9:1: warning: ‘noreturn’ function does return
 }
 ^
$ clang test.c
test.c:9:1: warning: function declared 'noreturn' should not return [-Winvalid-noreturn]
}
^

使用具有明确定义行为的 noreturn 的示例:

#include <stdio.h>
#include <stdlib.h>
#include <stdnoreturn.h>

noreturn void my_exit(void);

/* calls exit() and doesn't return to its caller. */
void my_exit(void)
{
    printf("Exiting...\n");
    exit(0);
}

int main(void)
{
    my_exit();
    return 0;
}