从使用 Noreturn 或 noreturn 函数说明符声明的函数返回
Version >= C11
函数说明符 _Noreturn
是在 C11 中引入的。头文件 <stdnoreturn.h>
提供了一个宏 noreturn
,它扩展为 _Noreturn
。因此,使用 <stdnoreturn.h>
中的 _Noreturn
或 noreturn
很好并且相当。
使用 _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;
}
gcc
和 clang
为上述程序发出警告:
$ 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;
}