免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6662 | 回复: 1

[C] 请问C函数声明中的NORETURN是什么意思? [复制链接]

论坛徽章:
11
摩羯座
日期:2013-09-29 17:39:09白羊座
日期:2014-11-13 09:38:14技术图书徽章
日期:2014-01-17 15:07:36狮子座
日期:2013-12-25 14:01:52技术图书徽章
日期:2013-12-17 11:33:22技术图书徽章
日期:2013-12-03 10:27:57天秤座
日期:2013-11-08 15:47:19申猴
日期:2013-10-29 13:16:32未羊
日期:2013-10-12 22:28:56辰龙
日期:2013-10-09 14:39:5515-16赛季CBA联赛之山东
日期:2016-07-25 10:23:00
发表于 2012-12-10 11:41 |显示全部楼层
如题,例如
  1. void errExit(const char *format, ...) NORETURN ;
复制代码
在链接或者编译阶段有什么实际作用吗,还是只是显式说明一下无返回值?
请各位指点一下,谢谢。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
发表于 2012-12-10 11:56 |显示全部楼层
NORETURN是个宏,在GCC中展开为__attribute__((__noreturn__)),在VC中展开为__declspec(noreturn),它不是说函数没有返回值,而是说一旦你调了这个函数,它永远不会返回。
有一些函数是永远不会返回的,比如abort或者exit之类,调用它们就结束程序。

这个声明会做几件事:
1、让编译器知道调用这种函数之后的语句不会执行,例如下面的程序:
void errExit(const char *format, ...) NORETURN ;
int f() {
   //...
   errExit(...);
}
一般情况下编译器会报一个警告,说int型的函数f没有返回值,但是由于errExit标记为NORETURN,编译器就知道f永远不会执行到errExit之后的语句,所以没有返回值的警告就不用生成了。
2、函数的调用者在调用返回后可能需要一些清理工作,比如调整桟指针等,如果一个函数被标记为NORETURN,那么编译器就知道这些清理工作可以省略,这样可以少生成一些无用代码。

评分

参与人数 1可用积分 +10 收起 理由
langue + 10 赞一个!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP