我是靠谱客的博主 超级酒窝,最近开发中收集的这篇文章主要介绍C/C++编程:__attribute__ noreturn为什么要有__attribute__((noreturn))其他例子,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
一些库函数,本身没有返回值,例如abort()和exit(),在编译的时候,GCC自动按照这个规则编译。而对于自己定义的函数,如果你不想让它有返回值,那么可以使用__attribute__ ((noreturn))
__attribute__ noreturn
- 这个属性告诉编译器函数不会返回。当遇到函数需要返回值却还没运行到返回值处就已退出来的情况,该属性可以避免出现错误信息。
- 用来抑制关于未达到代码路径的错误
C库函数中的abort()和exit()的声明格式就采用了这种格式:
extern void exit(int) __attribute__((noreturn));
extern void abort(void) __attribute__((noreturn));
为什么要有__attribute__((noreturn))
#include <stdio.h>
#include <stdlib.h>
extern void myexit(int);
int testFunc(void)
{
printf("-- Enter %s --", __func__);
myexit(0);
// 其实函数运行不到这里
printf("-- Exit %s --", __func__);
}
void myexit(int i)
{
exit(i);
}
int main()
{
return 0;
}
编译器会警告:
C:UsersAdministratorCLionProjectsnnnmain.cpp: In function 'int testFunc()':
C:UsersAdministratorCLionProjectsnnnmain.cpp:14:1: warning: no return statement in function returning non-void [-Wreturn-type]
所以应该定义为:
#include <stdio.h>
#include <stdlib.h>
extern void myexit(int) __attribute__((noreturn));
int testFunc(void)
{
printf("-- Enter %s --", __func__);
myexit(0);
// 其实函数运行不到这里
printf("-- Exit %s --", __func__);
}
void myexit(int i)
{
exit(i);
}
int main()
{
return 0;
}
其他例子
#include <stdio.h>
#include <stdlib.h>
void fatal(char *message) __attribute__((noreturn)); // 告诉编译器这个函数不会返回给调用者,以便编译器在优化时去掉不必要的函数返回代码。
void fatal(char *message)
{
fprintf(stderr, "FATAL ERROR:%sn", message);
exit(0); // 必须是exit
}
void foo(){
}
int main()
{
fatal("aaaaaaaaa");
foo(); // 永远不会被执行
return 0;
}
最后
以上就是超级酒窝为你收集整理的C/C++编程:__attribute__ noreturn为什么要有__attribute__((noreturn))其他例子的全部内容,希望文章能够帮你解决C/C++编程:__attribute__ noreturn为什么要有__attribute__((noreturn))其他例子所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复