c语言main不写return,main函数的末尾没有return语句会有什么影响

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

问题的本质

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

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

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

03f6f8534688ff315104b8810d0ca8d0.png

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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值