C语言main函数的正确写法

嵌入式技术

1332人已加入

描述

大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是C语言main函数的正确写法,希望能对你有所帮助

摘要:最近有粉丝说他是在校大学生,刚学C语言,看到main函数写法很多种,不知道哪种写法是对的,很是苦恼,想知道C语言的main函数到底标准写法是哪一种。说实话,一开始被问这个问题,一时半会儿也是回答不上来,平时做项目,也没仔细关注过这个。这不特意去学习了一下,也整理了一下,供参考。检测一下,你是否知道C语言main函数的这几种写法有何区别呢?

一、main函数的介绍

想必学过C语言的都知道,C程序的入口就是main函数,整个程序从main函数开始执行,在main函数中结束。实际上C程序可以没有main函数,入口函数可自行指定。

在嵌入式软件开发中,其实程序不是从main函数开始执行的,在main函数执行之前,会有硬件初始化,内存分配,汇编等,后面才执行到main函数。看一下嵌入式启动程序的汇编,你就会发现main函数是在汇编代码中绑定了,执行完汇编后,会跳转到main函数,所以在绑定main函数的地方,改成其他函数,那就会执行完汇编后,从该函数开始执行。

二、main函数的几种写法

2.1 方式一

无返回值,无参数。

在C89标准中,这种写法是可以接受的,但用现在的编译器编译时,会报警告,并且会将其返回值默认为int。如果函数没有显式声明返回类型,编译器会将返回值默认为int。

#include < stdio.h >


main()
{
  printf("hello,world!\\r\\n");
}

2.2 方式二

返回值为void,无参数

main函数执行完后,返回0,则表示程序正常结束;若返回非0数值,则表示异常退出,通常由系统决定。一旦声明为void,在程序退出后,想要获取其退出状态也就不可以了。因此不建议其返回值为void。

#include < stdio.h >


void main()
{
  printf("hello,world!\\r\\n");
}

2.3 方式三

返回值为int,参数为void

这是一种比较常见的写法,有返回值,返回值显式声明为int类型,返回0,则表示程序正常结束;若返回非0数值,则表示异常退出。参数为void,表示调用的时候,不能传入参数,也就不能获取命令行参数了。

#include < stdio.h >


int main(void)
{
  printf("hello,world!\\r\\n");
  return 0;
}

2.4 方式四

返回值为int,没有参数

这种方式和第三种方式没啥差别

#include < stdio.h >


int main()
{
  printf("hello,world!\\r\\n");
  return 0;
}

网上很多帖子用这个例子来说明,int main() 和int main(void)的区别,个人觉得不太恰当(可能是我没理解透,如有错误请指正goutou),此处的test的在函数定义是有形参的,只是声明时没有写形参(印象中函数的声明,可以不加形参的名字,加形参类型即可,但试了一下下面的例子,test声明时,没有加形参也没问题)而已,故而能传参。但int main()函数在定义时就没有形参,怎么能传参呢?此处有点纳闷

main

2.5 方式五

返回值为int,有两个参数

这也是最常见的写法,第一个参数为命令行参数个数,第二个为命令行参数内容。通常用于实现需要从命令行获取参数的功能。

  • 第一个参数argc,即argument count,即参数个数。
  • 第二个参数argv,即argument value,保存和传递参数的值。argv[0]是传给main函数的第一个参数,也就是可执行程序本身的名字
#include < stdio.h >


int main(int argc, char *argv[])
{
    int i;
    for (i=0; i < argc; i++)
    {
        printf("argument %d is %s.\\n", i, argv[i]);
    }


    return 0;
}

这种写法和int main(int argc, char **argv)是等价的

这是在Windows下执行的,gcc编译后,在Windows下生成 .exe

可以看到,没有通过命令行传入参数时,也会有一个参数打印出来,就是可执行程序本身,这是默认的;后面传入参数后,可看到打印出来的参数

main

2.6 方式六

返回值为int,有三个参数

和第五种差不多,只是多了一个参数,用于获取环境变量,这种形式多源于编译器扩展。但全局变量environ可以代替envp的作用,获取或者设置环境变量可以使用getenv或putenv,因此也没有必要使用该形式。

#include< stdio.h >


int main(int argc, char *argv[], char *envp[])
{
    int i;
    for (i=0; i < argc; i++)
    {
        printf("argument %d argv is %s, envp:%s.\\n", i, argv[i], envp[i]);
    }


    return 0;
}

执行结果

main

三、总结

C语言main函数有那么多种写法,那么平时到底该用哪中写法呢。我们来看看C标准文档,提供了两种main函数写法

main

C标准只提供了两种main的形式,建议平时写的时候使用标准形式。

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分