孔乙己:main函数有四样写法

main的几种写法  

当你刚开始学习C语言编程的时候,你会在main函数写个printf(“Hello World!");,以代表你已经进入了这个编程世界,准备开始装X了。

有一天,刚加完班,踩着月色路过咸亨饭馆,想想肚子也饿了,于是进去点了个快餐。拖着疲惫的身躯坐下来,习惯性把手机掏出来看一眼是否有新的消息,抬头一望不远处,孔乙己还在那里喝着酒,啃着茴香豆。他突然走过来,问我:“你是搞IT的吗?”我点了点头,说:“写过几行代码,你也懂这个?”他看着我的回答,越发高兴了,“那我考考你。”他脸上露出沧桑的笑容,发际线快推到了后脑勺了。我心里想,这模样了,也配考我?何况是这么高深的IT知识,你也懂?然而我还是礼貌地说好啊。“你知道main函数怎么写吗?”我吧唧吧唧跟他讲了。他说:“对啊对啊!……main函数有四样写法,你知道么?”我愈不耐烦了,努着嘴走远。孔乙己刚用指甲蘸了酒,想在柜上写字,见我毫不热心,便又叹一口气,显出极惋惜的样子。

好了,我告诉你main函数真的至少有4中写法,我还要告诉你他们有什么区别。(我要开始装X了)

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

你将它们参数和返回值再组合一下,可能会得到更多写法。好,现在不聊这个,先了解下它们有什么区别呢?

实践是检验真理的唯一标准。我们可以用以下代码来测试下:

 // none_main_none.c
 #include <stdio.h>
 main()
 {
     printf("%s\n", __FILE__);
 }
 // void_main_void.c
 #include <stdio.h>
 void main(void)
 {
     printf("%s\n", __FILE__);
 }
 // int_main_void.c
 #include <stdio.h>
 int main(void)
 {
     printf("%s\n", __FILE__);
     return 3;
 }
 // int_main_argc_argv.c
 #include <stdio.h>
 int main(int argc, char* argv[])
 {
     printf("%s\n", __FILE__);
     printf("%d, %s\n", argc, argv[0]);
     return 0;
 }

测试完,你应该有答案了。另外,你还会发现,没有返回值类型的main()实际上编译器会默认给它一个int类型的返回类型。

main的C99标准  

实际上,这可能是不同C语言标准版本的写法,前面两种有可能你会在嵌入式开发中遇到多点,后面两种是C99的标准。

我们见识下标准原文(ISO/IEC 9899:1999 (E))怎么写的:

5.1.2.2.1 Program startup

  1. The function called at program startup is named main. The implementation declares noprototype for this function. It shall be defined with a return type of int and with noparameters:int main(void) { /* ... */ }or with two parameters (referred to here as argc and argv, though any names may beused, as they are local to the function in which they are declared):int main(int argc, char *argv[]) { /* ... */ }or equivalent;9) or in some other implementation-defined manner.

  2. If they are declared, the parameters to the main function shall obey the followingconstraints: — The value of argc shall be nonnegative.argv[argc] shall be a null pointer. — If the value of argc is greater than zero, the array members argv[0] through argv[argc-1] inclusive shall contain pointers to strings, which are given implementation-defined values by the host environment prior to program startup. The intent is to supply to the program information determined prior to program startup from elsewhere in the hosted environment. If the host environment is not capable of supplying strings with letters in both uppercase and lowercase, the implementation shall ensure that the strings are received in lowercase. — If the value of argc is greater than zero, the string pointed to by argv[0] represents the program name; argv[0][0] shall be the null character if the program name is not available from the host environment. If the value of argc is greater than one, the strings pointed to by argv[1] through argv[argc-1] represent the program parameters. — The parameters argc and argv and the strings pointed to by the argv array shall be modifiable by the program, and retain their last-stored values between program startup and program termination.

5.1.2.2.3 Program termination1 If the return type of the main function is a type compatible with int, a return from theinitial call to the main function is equivalent to calling the exit function with the valuereturned by the main function as its argument;10) reaching the } that terminates themain function returns a value of 0. If the return type is not compatible with int, thetermination status returned to the host environment is unspecified.Forward references: definition of terms (7.1.1), the exit function (7.20.4.3).

如果你亲手操作运行测试,并将这段标准内容看一看,你不懂都可以装懂了。

main参数与返回值的作用

再问一个问题:main函数的返回值和参数有什么作用?

Talk is cheap, show me the code. ——Linus Torvalds

我们不讲理论,直接上代码:

 // plus.c
 #include <stdio.h>
 #include <stdlib.h>
 int main(int argc, char* argv[])
 {
     printf("%s\n", argv[0]);
     if(argc == 4)
    {
         if(argv[2][0] == '+')
        {
             int sum = atoi(argv[1]) + atoi(argv[3]);
             printf("%s %s %s = %d\n", argv[1], argv[2], argv[3], sum);
             return 0;
        }
         else
        {
             return 2;
        }
    }
     else
    {
         return 1;
    }
 }

我们在Linux上用gcc编译并运行来看看 gcc plus.c -o plus

 >> ./plus 1 + 1
 >> ./plus
 >> 1 + 1 = 2
 >> echo $?
 >> 0

argc是参数的个数加1,上面例子中./plus 1 + 1有三个参数(注意以空格隔开各个参数),argc为4,而argv[0]是程序名字./plus。那么echo $?呢?它是Linux用来查看这个程序的返回值的,即程序运行后的结果, 你可以试试./plus 1 * 1或者./plus 1 + 1 + 1会得到不一样的返回值。如果在Windows做测试,你可以用echo %errorlevel%来查看。

一般情况下,返回值0代表程序运行成功,其他值代表这个各种不同的错误。

到这里,你也许应该明白Linux或者Windows上的各种命令的秘密了吧,例如grep -rn "ABC" ./,这个grep就是一个单独的程序做成的命令,而其后面的内容就是各种参数。

我们是不是可以在系统上写几个程序快乐地玩耍了?

等等,骚年,你先别走。老衲再问你两个问题:一个程序真的是从main函数开始的吗?main函数的名字是不是一定要写成main,写成your_main_a行不行?

欲知后事如何,且听下回分解。


嵌入式软件实战派 专注嵌入式软件开发领域知识传授,包括C语言精粹,RTOS原理与使用,MCU驱动开发,AUTOSAR搭建,软件架构方法设计等。
评论
  • 高速先生成员--黄刚这不马上就要过年了嘛,高速先生就不打算给大家上难度了,整一篇简单但很实用的文章给大伙瞧瞧好了。相信这个标题一出来,尤其对于PCB设计工程师来说,心就立马凉了半截。他们辛辛苦苦进行PCB的过孔设计,高速先生居然说设计多大的过孔他们不关心!另外估计这时候就跳出很多“挑刺”的粉丝了哈,因为翻看很多以往的文章,高速先生都表达了过孔孔径对高速性能的影响是很大的哦!咋滴,今天居然说孔径不关心了?别,别急哈,听高速先生在这篇文章中娓娓道来。首先还是要对各位设计工程师的设计表示肯定,毕竟像我
    一博科技 2025-01-21 16:17 100浏览
  • 现在为止,我们已经完成了Purple Pi OH主板的串口调试和部分配件的连接,接下来,让我们趁热打铁,完成剩余配件的连接!注:配件连接前请断开主板所有供电,避免敏感电路损坏!1.1 耳机接口主板有一路OTMP 标准四节耳机座J6,具备进行音频输出及录音功能,接入耳机后声音将优先从耳机输出,如下图所示:1.21.2 相机接口MIPI CSI 接口如上图所示,支持OV5648 和OV8858 摄像头模组。接入摄像头模组后,使用系统相机软件打开相机拍照和录像,如下图所示:1.3 以太网接口主板有一路
    Industio_触觉智能 2025-01-20 11:04 150浏览
  • 2024年是很平淡的一年,能保住饭碗就是万幸了,公司业绩不好,跳槽又不敢跳,还有一个原因就是老板对我们这些员工还是很好的,碍于人情也不能在公司困难时去雪上加霜。在工作其间遇到的大问题没有,小问题还是有不少,这里就举一两个来说一下。第一个就是,先看下下面的这个封装,你能猜出它的引脚间距是多少吗?这种排线座比较常规的是0.6mm间距(即排线是0.3mm间距)的,而这个规格也是我们用得最多的,所以我们按惯性思维来看的话,就会认为这个座子就是0.6mm间距的,这样往往就不会去细看规格书了,所以这次的运气
    wuliangu 2025-01-21 00:15 186浏览
  •  万万没想到!科幻电影中的人形机器人,正在一步步走进我们人类的日常生活中来了。1月17日,乐聚将第100台全尺寸人形机器人交付北汽越野车,再次吹响了人形机器人疯狂进厂打工的号角。无独有尔,银河通用机器人作为一家成立不到两年时间的创业公司,在短短一年多时间内推出革命性的第一代产品Galbot G1,这是一款轮式、双臂、身体可折叠的人形机器人,得到了美团战投、经纬创投、IDG资本等众多投资方的认可。作为一家成立仅仅只有两年多时间的企业,智元机器人也把机器人从梦想带进了现实。2024年8月1
    刘旷 2025-01-21 11:15 399浏览
  • 日前,商务部等部门办公厅印发《手机、平板、智能手表(手环)购新补贴实施方案》明确,个人消费者购买手机、平板、智能手表(手环)3类数码产品(单件销售价格不超过6000元),可享受购新补贴。每人每类可补贴1件,每件补贴比例为减去生产、流通环节及移动运营商所有优惠后最终销售价格的15%,每件最高不超过500元。目前,京东已经做好了承接手机、平板等数码产品国补优惠的落地准备工作,未来随着各省市关于手机、平板等品类的国补开启,京东将第一时间率先上线,满足消费者的换新升级需求。为保障国补的真实有效发放,基于
    华尔街科技眼 2025-01-17 10:44 221浏览
  • 数字隔离芯片是一种实现电气隔离功能的集成电路,在工业自动化、汽车电子、光伏储能与电力通信等领域的电气系统中发挥着至关重要的作用。其不仅可令高、低压系统之间相互独立,提高低压系统的抗干扰能力,同时还可确保高、低压系统之间的安全交互,使系统稳定工作,并避免操作者遭受来自高压系统的电击伤害。典型数字隔离芯片的简化原理图值得一提的是,数字隔离芯片历经多年发展,其应用范围已十分广泛,凡涉及到在高、低压系统之间进行信号传输的场景中基本都需要应用到此种芯片。那么,电气工程师在进行电路设计时到底该如何评估选择一
    华普微HOPERF 2025-01-20 16:50 73浏览
  •  光伏及击穿,都可视之为 复合的逆过程,但是,复合、光伏与击穿,不单是进程的方向相反,偏置状态也不一样,复合的工况,是正偏,光伏是零偏,击穿与漂移则是反偏,光伏的能源是外来的,而击穿消耗的是结区自身和电源的能量,漂移的载流子是 客席载流子,须借外延层才能引入,客席载流子 不受反偏PN结的空乏区阻碍,能漂不能漂,只取决于反偏PN结是否处于外延层的「射程」范围,而穿通的成因,则是因耗尽层的过度扩张,致使跟 端子、外延层或其他空乏区 碰触,当耗尽层融通,耐压 (反向阻断能力) 即告彻底丧失,
    MrCU204 2025-01-17 11:30 182浏览
  •     IPC-2581是基于ODB++标准、结合PCB行业特点而指定的PCB加工文件规范。    IPC-2581旨在替代CAM350格式,成为PCB加工行业的新的工业规范。    有一些免费软件,可以查看(不可修改)IPC-2581数据文件。这些软件典型用途是工艺校核。    1. Vu2581        出品:Downstream     
    电子知识打边炉 2025-01-22 11:12 53浏览
  • 本文介绍瑞芯微开发板/主板Android配置APK默认开启性能模式方法,开启性能模式后,APK的CPU使用优先级会有所提高。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。源码修改修改源码根目录下文件device/rockchip/rk3562/package_performance.xml并添加以下内容,注意"+"号为添加内容,"com.tencent.mm"为AP
    Industio_触觉智能 2025-01-17 14:09 164浏览
  • 临近春节,各方社交及应酬也变得多起来了,甚至一月份就排满了各式约见。有的是关系好的专业朋友的周末“恳谈会”,基本是关于2025年经济预判的话题,以及如何稳定工作等话题;但更多的预约是来自几个客户老板及副总裁们的见面,他们为今年的经济预判与企业发展焦虑而来。在聊天过程中,我发现今年的聊天有个很有意思的“点”,挺多人尤其关心我到底是怎么成长成现在的多领域风格的,还能掌握一些经济趋势的分析能力,到底学过哪些专业、在企业管过哪些具体事情?单单就这个一个月内,我就重复了数次“为什么”,再辅以我上次写的:《
    牛言喵语 2025-01-22 17:10 41浏览
  • 嘿,咱来聊聊RISC-V MCU技术哈。 这RISC-V MCU技术呢,简单来说就是基于一个叫RISC-V的指令集架构做出的微控制器技术。RISC-V这个啊,2010年的时候,是加州大学伯克利分校的研究团队弄出来的,目的就是想搞个新的、开放的指令集架构,能跟上现代计算的需要。到了2015年,专门成立了个RISC-V基金会,让这个架构更标准,也更好地推广开了。这几年啊,这个RISC-V的生态系统发展得可快了,好多公司和机构都加入了RISC-V International,还推出了不少RISC-V
    丙丁先生 2025-01-21 12:10 112浏览
  • Ubuntu20.04默认情况下为root账号自动登录,本文介绍如何取消root账号自动登录,改为通过输入账号密码登录,使用触觉智能EVB3568鸿蒙开发板演示,搭载瑞芯微RK3568,四核A55处理器,主频2.0Ghz,1T算力NPU;支持OpenHarmony5.0及Linux、Android等操作系统,接口丰富,开发评估快人一步!添加新账号1、使用adduser命令来添加新用户,用户名以industio为例,系统会提示设置密码以及其他信息,您可以根据需要填写或跳过,命令如下:root@id
    Industio_触觉智能 2025-01-17 14:14 122浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦