一.main()函数是什么样的

我们先要搞清楚main()函数有哪几种?

查阅C89/C99/C11标准文档,里面明确固定了两种写法:

int main(void) { /* ... */ }

int main(int argc, char *argv[]) { /* ... */ }

除此之外,其他写法应该都是不规范的写法,常见的有以下几种

1、main()

直接的mian()并没有返回值,没有入参。这种写法实际来说,部分编译器会显示警告,并且会返回默认值为int。不过在C89标准中其实是可以的,由于没有声明返回类型,所以才会返回默认值int。

2、void main()

初学者经常会使用的形式,但是并不知道来源在哪。这种写法的返回值是void,没有参数。值得注意的是,一旦声明是void,在程序退出后,想要获取其退出状态也就不可以了。

3、int main(void)

比较常见的写法,这种写法的形参为void,表明它在调用的时候不能传入任何参数,那么它也就不能获取命令行参数了。

4、int main ()

和上面第3种看起来好像没啥区别,但是还是有些许不同。main函数虽然声明为无入参,但调用时却是可以传入任何参数或不传参数的。

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

int argc入参为命令行参数个数,char *argv[]入参为命令行参数数组。这种写法也比较常见的,主要用在需要从命令行获取参数的功能。

6、int main(int argc,char *argv[],char *envp[])

包含三个参数的一种写法,上面第5种的升级版,int argc是命令行参数个数,char *argv[]是命令参数数组,char *envp[]是环境变量数组。虽然只比第六种多了一个参数,但全局变量environ可以代替envp的作用,获取或者设置环境变量可以使用getenv或putenv,因此也没有必要使用该形式。这种写法多源于编译器的扩展。

写法多样有些算是历史遗留有些算是编译器的扩展,还有些不知道从哪里生出来的。为了代码的通用可移植性,建议采用C89/C99/C11标准文档中规定的这两种写法。

二.谁在调用main()函数,是否必须有main()函数

1、编译链接时的引导代码。操作系统的应用程序其实在mian执行前也需要运行一段引导代码才可以执行main,我们写应用程序的时候不需要考虑引导代码。编译链接时(准确说是链接)由链接器中事先准备好的引导代码给链接进去和我们写的应用程序一起构成最终的可执行程序。

2、运行时的加载器。加载器是操作系统中的程序,当我们去执行一个程序时,加载器负责将这个程序加载到内存中去执行这个程序。

3、程序在编译链接时使用链接器,运行时使用加载器,这两个东西对程序运行原理非常重要。

上面一段解释,相信大家已经明白了,是否叫main()函数取决于我们编译特别是链接时指定的入口函数,如何调用完全由操作系统。很简单的一个道理,比如我事先写好了调用“usrapp”函数,那么你在写函数体的时候名字就必须叫usrapp,而我如果改成叫"usrapp1"的函数,你在写函数体的时候就必须写成“usrapp1”,同样的道理,操作系统在某种情况下找main函数,此时你就应该写"main"的函数名,如果操作系统在其他的情况下找“WinMain”或者“WinMain2”的时候,你自然就应该把入口函数写成“WinMain”或者“WinMain2”了。那么这里写成"main"不行,写成“WinMain”却可以,就不难理解了。

所以说必须有main函数只是针对windows操作系统而已,其他操作系统是允许我们在链接时,修改链接选项,制定我们程序的入口函数,此时入口函数就可以任由我们发挥了,只需要符合变量命名规则即可,虽然是这样,但是在整个工程中,还是必须只能有一个入口函数,只是名字换了而已。

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

C语言程序main入口函数相关推荐

  1. C语言程序的入口真的是main方法吗?

    从刚开始学C语言的时候就给我们大脑里灌输了一个知识点: main函数是程序的入口,并且有且仅有一个. 当时我学习这个部分的时候对此深信不疑,main嘛,主嘛,那肯定就这个是入口了 根据后来的学习,慢慢 ...

  2. C语言-程序耗费时间函数

    C语言-程序耗费时间函数 #include <stdio.h> #include <time.h> //clock()函数,捕捉从程序开始运行到clock()被调用所耗费的时间 ...

  3. c语言程序的入口是哪部分,C语言入口函数和LD_PRELOAD环境变量

    零.C语言入口函数 从第一天学习C语言开始,我们的脑子里就深深烙下这样一个概念:C语言程序总是从main()函数开始执行,main()函数结束,程序也就结束了.在平时的练习中貌似这没有问题,但事实真的 ...

  4. 【C语言程序】编写函数返回体温值

    题出自-----------------------------零基础学C语言 #include<stdio.h> int T(); int main() {T();return 0; } ...

  5. c语言程序中的函数的函数名,一个C语言程序是由一个或多个函数组成的,其中必须包含一个函数,函数名是mian。...

    解析: [解析题]绿茶的茶水比一般是1:50. [解析题]以下程序的输出结果是 ________ . struct HAR { int x;int y;struct HAR *p;}h[2];int ...

  6. Fortran语言程序设计基础 02 函数和子例行程序习题

    目录 1.弧度转换(语句函数) 2.矩阵相加 3.矩阵相乘 4.计算阶乘(递归子例行程序) 5.计算两个整数的最大公约数(递归子例行程序) 6.计算两个整数的最大公约数(递归函数) 7.求解二元一次方 ...

  7. c语言程序有且只有一个什么函数,一个c程序有且仅有一个什么函数

    一个c程序有且仅有一个主函数(main()函数).一个C语言源程序可以由一个或多个源文件组成.一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数. main函数是C程序的入口函 ...

  8. Windows应用程序入口函数编写

    转自 http://www.vckbase.com/document/viewdoc/?id=1724 觉得对于理解MFC有作用,下面的东西都是被MFC封装的. 写任何一个函数应该有一个该函数的入口了 ...

  9. Modern OpenGL - GLSL着色语言2:GLSL入口函数和GLSL中的变量

    文章目录 1 GLSL的入口函数和基本结构 2 GLSL中的变量声明 3 GLSL中变量的作用域 4 GLSL中变量的初始化 5 GLSL中变量的隐式转换 1 GLSL的入口函数和基本结构 对于很多编 ...

最新文章

  1. 绍兴袍江计算机培训,绍兴春华电脑基础培训班
  2. UA OPTI512R 傅立叶光学导论5 光学常用基本函数回顾
  3. [转载]windows phone 墓碑化(9)
  4. ninja: error: 'LIBSOUNDIO_LIB-NOTFOUND', needed by 'bin/k4aviewer', missing and no known rule to mak
  5. PLSQL Developer图形化窗口创建数据库全过程
  6. 《信息安全系统设计基础》实验一 开发环境的熟悉
  7. pycharm和jupyter notebook中的快捷键
  8. ASP.NET 会话状态概览
  9. rabbitmq direct 多个消费者_RabbitMQ从零开始
  10. 卷积神经网络工作原理直观的解释
  11. python,web框架说明
  12. linux下c语言动态库生成方法
  13. perl中uc,lc,ucfirst,lcfirst的用法(转载)
  14. 蓝桥杯—日志统计—跟外卖店优先级比较类似
  15. matlab求隐函数二阶导,求隐函数二阶导数.ppt
  16. 宽带信号的DOA估计学习笔记(一)
  17. Intellij IDEA的安装及使用介绍
  18. 【51单片机】七段数码管显示实验+详细讲解
  19. 血清、血浆、全血、脑脊液、尿液——临床标本大全
  20. python安装要装oracle,python安装oracle数据库

热门文章

  1. Java ArrayDeque
  2. antlr java_使用ANTLR和Java创建外部DSL
  3. fusion构建器代码语法_构建器模式:适用于代码,适用于测试
  4. 无服务器革命:好,坏和丑
  5. 使用Java 8处理并行数据库流
  6. 带有Spring Cloud Microservices的JSON Web令牌
  7. 确定活动的热点垃圾收集器
  8. Spring 3.2 @ControllerAdvice批注的异常处理
  9. Hadoop中的问题–何时无法交付?
  10. GWT 2 Spring 3 JPA 2 Hibernate 3.5教程– Eclipse和Maven 2展示