C语言程序main入口函数

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

声明:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring可用于数据层吗_Spring XD用于数据提取

spring可用于数据层吗Spring XD是一个功能强大的工具,它是一组可安装的Spring Boot服务,可以独立运行,在YARN或EC2之上运行。 Spring XD还包括一个管理UI网站和一个用于作业和流管理的命令行工具。 Spring XD是一组功能强大的服务&#xff0c…

go语言mysql操作_使用Go语言操作MySQL数据库的思路与步骤

最近在做注册登录服务时,学习用Go语言操作MySQL数据库实现用户数据的增删改查,现将个人学习心得总结如下,另外附有代码仓库地址,欢迎各位有兴趣的fork。软件环境:Goland、Navicat for MySQL。一、实现思路1&#xff0c…

学习嵌入式C语言的6个层级,你在哪一层?

C语言可以说是一种经典的编程语言,没有C语言就没有今天的各种操作系统。C语言是基础,那么你掌握了多少?新手级别学习目的:过计算机二级,考证,应付期末考试。需要掌握的程度:掌握C语言的基本语法…

intellij idea_IntelliJ IDEA内部设计

intellij ideaIntelliJ IDEA的第一个版本于2001年1月发布,当时它是第一个集成了高级代码导航和代码重构功能的Java IDE之一。 2009年,JetBrains开源了其社区版本 。 从那时起,创建了许多基于它的IDE,例如Google的Android Studio。…

C语言 | 函数执行成功时,return 1 还是return 0?

今天分享的内容是关于函数执行成功,返回0还是1的讨论~基本上,没有人会将大段的C语言代码全部塞入 main() 函数,更好的做法是按照复用率高,耦合性低的原则,尽可能的将代码拆分不同的功能模块,并封装成函数。…

jcache_窥探JCache API(JSR 107)

jcache这篇文章从较高的层次介绍了JCache API,并提供了一个预告片–仅够您(希望)开始对此发痒了;-) 在这篇文章中……。 JCache概述 JCache API,实现 JCache API支持的(Java)平台 快速了解O…

redis 启动加载mysql_Redis分析系列:启动加载过程

从本篇文章开始(命名为Redis分析系列),将会通过分析Redis的源代码(以Redis 2.2.0 RC1为准),来对它的内部实现做一些探讨。本文主要介绍Redis启动加载过程,总体上可以分为如下几步:1. 初始化全局服务器配置2. 加载配置文件(如果指定…

c 文件怎么进行读取和写入操作?

C >>和<<读写文本文件&#xff1a;fstream 或者 ifstream 类负责实现对文件的读取&#xff0c;它们内部都对 >> 输出流运算符做了重载&#xff1b;同样&#xff0c;fstream 和 ofstream 类负责实现对文件的写入&#xff0c;它们的内部也都对 << 输出流…

mysql+误操作怎么恢复_Mysql误操作恢复流程

一、开启binlog。show variables like log_bin;#vim /etc/my.cnf在[mysqld]中加入log-bin mysql-binlog-bin /usr/local/mysql/log/mysql-bin.log重启mysql服务#service mysqld stop#service mysqld start二、数据写入建库create database …

drools6.5_Drools 6.2.0.Final发布

drools6.5我们很高兴地宣布最新&#xff0c;最出色的Drools 6.2.0.Final版本。 特别是此发行版更加注重改进的可用性和功能&#xff0c;这些功能使项目更易于使用&#xff08;和采用&#xff09;。 新功能包括对工作台UI的大量改进&#xff0c;对社交活动和插件管理的支持以及…

c程序编写x的y次方的方法

c程序怎么编写x的y次方?C语言pow()函数&#xff1a;求x的y次方&#xff08;次幂&#xff09;头文件&#xff1a;#include pow() 函数用来求 x 的 y 次幂&#xff08;次方&#xff09;&#xff0c;其原型为&#xff1a;double pow(double x, double y);pow()用来计算以x 为底的…

8条嵌入式C语言编程小知识总结

1. 流水线被指令填满时才能发挥最大效能&#xff0c;即每时钟周期完成一条指令的执行(仅指单周期指令)。如果程序发生跳转&#xff0c;流水线会被清空&#xff0c;这将需要几个时钟才能使流水线再次填满。因此&#xff0c;尽量少的使用跳转指令可以提高程序执行效率&#xff0c…

c语言函数的三种调用方式是什么?

函数的三种调用方式&#xff1a;1、函数作为表达式中的一项出现在表达式中&#xff0c;例“zmax(x,y)”&#xff1b;2、函数作为一个单独的语句&#xff0c;例“printf("%d",a)”&#xff1b;3、函数作为调用另一个函数时的实参&#xff0c;例“printf("%d"…

弱口令扫描工具mysql ftp_基于端口的弱口令检测工具--iscan

iscan: 基于端口的弱口令检测工具亲手打造了一款基于端口的弱口令检测工具&#xff0c;使用python进行编写&#xff0c;主要可以用于渗透测试中常见服务端口弱口令的检测。目前支持以下服务&#xff1a;系统弱口令&#xff1a;ftp、ssh、telnet、ipc$数据库弱口令&#xff1a;m…

javafx 剪切板_JavaFX技巧18:路径剪切

javafx 剪切板我最近注意到&#xff0c;我致力于ControlsFX项目的PopOver控件无法正确剪切其内容。 当我为FlexCalendarFX框架开发手风琴弹出窗口时&#xff0c;这一点变得显而易见。 每当最后一个标题窗格扩展时&#xff0c;其底角不再是圆角而是正方形。 在标题窗格中放置一个…

嵌入式开发中C语言编程要点简述!

在嵌入式Linux的C语言开发中&#xff0c;C语言的基本编程依然是最重要的内容。除此之外&#xff0c;与一般的C语言编程相比&#xff0c;嵌入式Linux的C语言编程有以下一些要点&#xff1a;1、库函数与系统调用在进行C语言编程的时候&#xff0c;使用库函数是不可避免的。关于使…

C语言中,break和continue都是跳出循环,有啥区别?

首先说明&#xff1a;continue 只能用于循环语句中&#xff0c;而break可用于循环和 switch 语句&#xff0c;两者都是辅助循环&#xff1b;尽管如此&#xff0c;如果 switch 语句在一个循环中&#xff0c;continue便可作为 switch 语句的一部分&#xff1b;这种情况下&#xf…

C 的 3种内存顺序,你都知道吗?

1、std::memory_order_relaxed “自由”内存顺序在原子类型上的操作以自由序列执行&#xff0c;没有任何同步关系&#xff0c;仅对此操作要求原子性。例如&#xff0c;在某一线程中&#xff0c;先写入A&#xff0c;再写入B。但是在多核处理器中观测到的顺序可能是先写入B&#…

C 常见的面试知识点(上)

const 作用1&#xff0c;修饰变量&#xff0c;说明该变量不可以被改变2&#xff0c;修饰指针&#xff0c;分为指向常量的指针&#xff08;pointer to const&#xff09;和自身是常量的指针&#xff08;常量指针&#xff0c;const pointer&#xff09;3&#xff0c;修饰引用&…

C 常见的面试知识点(下)

inline 内联函数的特征相当于把内联函数里面的内容写在调用内联函数处&#xff1b;相当于不用执行进入函数的步骤&#xff0c;直接执行函数体&#xff1b;相当于宏&#xff0c;却比宏多了类型检查&#xff0c;真正具有函数特性&#xff1b;编译器一般不内联包含循环、递归、swi…