0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

main函数的末尾没有return语句会有什么影响

Wildesbeast 来源:今日头条 作者:linux内核 2020-02-20 15:32 次阅读

c语言中,如果main函数的末尾没有return语句将会有什么影响?":

问题的本质

回答这个问题其实只要理解一个东西就行了:

那就是带有返回值的函数请务必提供返回值,这个是基本约定也是编程习惯,如果大家都遵守,你不遵守,各种奇葩和头疼的后果就迟早会来,不管是 main 也好,其他函数也好。

所以,准大一这个时候一定要从现在开始养成习惯,遵守语言的基本约定。

main 的标准声明

main 的标准声明是什么?

int main(int argc, char *argv[])

很多同学写例子,也有这么写的?

void main(void) { }

实际上,完整的 main 声明还有第三个参数 env,这里不做展开。

C 语言各标准差异以及静态检测方法

这种可以用 -Wall 检查出来:

$ echo 'void main(void) {}' | gcc -Wall -x c - - :1:6: warning: return type of ‘main’ is not ‘int’ [-Wmain]

如果用 int 默认检查不出来 return value ,默认是兼容 c11 的 gnu11:

$ echo 'int main(void) {}' | gcc -Wall -x c - - $ echo 'int main(void) {}' | gcc -Wall -std=gnu11 -x c - -

试了下,c99 之后都是没有提示问题。但是 c90 以及之前都提示需要加返回值:

$ echo 'int main(void) {}' | gcc -Wall -std=c90 -x c - - : In function ‘main’: :1:1: warning: control reaches end of non-void function [-Wreturn-type]

考虑到兼容性,建议务必养成写法上的习惯。由于 main 稍微特殊些,c99 默认处理了,但是对于其他函数还是要自己加,不做处理的话,是有很大风险的。

对于 c99 以及之后的版本,对普通函数还是会做检查。如果有的写,有的不写,不一致的话久而久之习惯就很难养成了。

$ echo 'int test(void) {}; int main(void) { test(); }' | gcc -Wall -std=c99 -x c - - : In function ‘test’: :1:1: warning: control reaches end of non-void function [-Wreturn-type]

由于人总会出错,所以,在编译的 cflags 里头,建议强制加上 -Wall -Werror,在遇到这类错误是强制退出,而不仅仅是警告。当然,对于已经存在的项目,prove-in-use 的情况下,建议保留之前的默认配置选项,除非要确实投入很多精力去重构。

$ echo 'int main(void) {}' | gcc -Wall -Werror -std=c90 -x c - - : In function ‘main’: :1:1: error: control reaches end of non-void function [-Werror=return-type] cc1: all warnings being treated as errors

关于返回值的含义

需要注意的是,默认情况下,没有错误,就是 return 0,而不是 return 1。

完整的模板:

int main(int argc, char *argv[]) { return 0; }

上面多次提到了后果和风险,为什么?因为检查函数和程序返回值是一个最最基础的操作。如果不按常理返回正确的返回值,后果是,后续对该值的检查所做出的所有动作都可能不可预知。

这个值是怎么体现的呢?

$ echo -e 'int main(void){ return 0; }' | gcc -Wall -Werror -std=c99 -O0 -x c - - $ ./a.out $ echo $? 0 $ echo -e 'int main(void){ return 100; }' | gcc -Wall -Werror -std=c99 -O0 -x c - - $ ./a.out $ echo $? 100

比如说,在 Shell 编程中通常会在程序执行完,立即检查返回值,然后决定接下去做什么操作?

if [ $? -eq 0 ]; then echo 'Success'; else echo 'Failure'; fi

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7528

    浏览量

    128324
  • 函数
    +关注

    关注

    3

    文章

    3864

    浏览量

    61307
收藏 人收藏

    评论

    相关推荐

    void main()还是int main()?

    操作系统)。 如果 main 函数的最后没有return 语句的话,C99 规定编译器要自动在生成的目标文件中(如 exe 文件)加入
    发表于 12-17 20:21

    main函数返回值的认知

    *argv[] ) 。main 函数的返回值类型必须是 int ,这样返回值才能传递给操作系统。 如果 main 函数的最后没有
    发表于 10-24 11:08

    C语言,函数return的作用

    在一个函数中,不管return处于什么位置,只要执行了return 就跳出函数,是这样吗?比如在for,wile或if循环语句中,即使不满足
    发表于 05-09 09:48

    为什么OSStart()函数之后的函数不能被执行但后面会加别的语句

    在原子的代码OSStart()之后添加测试代码,测试发现没有执行,但是看有些人会在OSStart()之后写上while(1);或是return(0);的语句,不知道何解?
    发表于 09-05 04:35

    浅谈C语言return语句的用法

    函数没有类型(类型为void),那么它就没有返回值,也就是说子函数没有return
    发表于 05-11 09:45

    浅谈C语言return语句main 函数的返回值

    函数中,如果碰到return 语句,那么程序就会返回调用该函数的下一条语句执行,也就是说跳出函数
    发表于 05-10 10:53 4980次阅读

    科普:Python函数默认返回 None 的原因

    Python 有一项默认的做法,很多编程语言都没有——它的所有函数会有一个返回值,不管你有没有return
    的头像 发表于 08-17 11:39 2124次阅读

    C语言的main函数有几种写法?

    从学习C语言开始就一直写个一个函数,那么你知道它的标准写法什么什么样吗? main函数,又称主函数,是程序执行的起点,我们平时写的main
    的头像 发表于 10-15 11:04 3067次阅读

    深度剖析C语言的main函数

    main的返回值 main函数的返回值用于说明程序的退出状态。如果返回0,则代表程序正常退出。返回其它数字的含义则由系统决定。通常,返回非零代表程序异常退出。 void main()
    的头像 发表于 12-18 17:07 4069次阅读

    C语言编程中main()函数退出之后程序去哪儿了

    对于嵌入式系统,如果没有运行RTOS,那么程序开发中的主函数main()需要通过某种机制使其永远愉快的运行下去,它没有终点。如果想从main
    的头像 发表于 03-22 17:44 2376次阅读

    return-函数的返回值是什么

    return关键字后接变量名或表达式可以将函数的计算结果返回到调用处。变量或表达式等同于接收果汁、豆浆的杯子。如果函数没有返回值,return
    的头像 发表于 02-23 10:52 788次阅读
    <b class='flag-5'>return</b>-<b class='flag-5'>函数</b>的返回值是什么

    C语言编程中main函数退出后程序去哪儿了?

    PIC 单片机语言程序进行跟踪,发现main() 函数最后一条语句为 reset,也就是单片机直接复位,这是 MAPLAB编译器根据 PIC 单片机特点增加的复位语句
    发表于 05-31 15:28 225次阅读
    C语言编程中<b class='flag-5'>main</b><b class='flag-5'>函数</b>退出后程序去哪儿了?

    为什么Python没有main函数

    今天的文章中,我们来讨论一下为什么有的编程语言有main函数,而Python为什么没有main函数
    发表于 08-17 11:47 170次阅读

    python函数返回多个参数

    。 在Python中,可以使用关键字 return 来返回一个或多个值。在函数定义的末尾,可以使用 return 语句来指定
    的头像 发表于 11-21 16:37 477次阅读

    if嵌套函数的正确输入方法为

    = nested_function() # 使用嵌套函数的结果进行后续操作 else : # else语句的逻辑 return result 在上面的示例中,我们首先定义了一个名为 main
    的头像 发表于 11-30 16:50 583次阅读