你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

你明白要怎么写main函数吗?

[复制链接]
gaosmile 发布时间:2020-3-26 14:07
但凡是学过C语言的人,都知道要先写main函数,然而很多时候我们看到的main函数却各有差异,这究竟是为啥?哪种是对的呢?今天我们就来聊聊main函数。

' J, |" ~. v) ~4 V- t+ u. Y" D. f那么main函数一共有多少个版本呢?3 N4 N* u3 I, Z5 ?4 D1 i
1、main()" `: g+ |1 t. v: J0 ^, {3 i- j
直接的mian()并没有返回值,没有入参。这种写法实际来说,部分编译器会显示警告,并且会返回默认值为int。不过在C89标准中其实是可以的,由于没有声明返回类型,所以才会返回默认值int。

' K6 Q( w4 e0 L* l1 u. V! X2、void main(): E: i# P6 G5 \% W+ k
初学者经常会使用的形式,但是并不知道来源在哪,在C89/C99/C11等文档中都没有提到这种形式的痕迹。这种写法的返回值是void,没有参数。值得注意的是,一旦声明是void,在程序退出后,想要获取其退出状态也就不可以了。所以还是不建议返回值为void的。
0 \8 ^) a" j) Y+ q( }3、int main(void)
  ]4 A; u( g' `& K/ _
: b4 K4 U! L  y4 Y% u, s
比较常见的写法,这种写法的形参为void,表明它在调用的时候不能传入任何参数,那么它也就不能获取命令行参数了。+ M. L0 _+ h( u. e
, P" z6 H0 F8 g0 {( d( |! t- \
4、int main ()
# s5 N' E1 W" ?2 S9 R  Y5 A8 \- `和上面第3种看起来好像没啥区别,但是还是有些许不同。就下面例子来说:
( ?% @8 u. _% G
  1. & y! }# c* a% t3 X: s  j2 A4 D
  2. #include<stdio.h>2 F; m1 F9 q5 H) W( G$ a  ^
  3. void  test();" m8 u/ o9 E1 n& ^
  4. int main() - M5 V% `! c8 {1 p  C
  5. {
    4 M% V/ s8 O1 {1 {
  6.     test(4);4 d4 v: P6 y: f
  7.     return 0;
    % m/ s. k  U5 i; e/ ~
  8. }
    $ m' t' W, E8 {6 u
  9. void test(int a)  Y3 E2 o1 q& P* B! X
  10. {
      f9 ]: o; }" m/ {
  11.     printf("%d",a);  t( Q3 q8 p  A; n3 T# ]
  12. }
复制代码
4 ]) H: J1 _& b$ F) N/ E

; P4 }7 `7 D) }7 p% n
程序仍然可以正常运行,test函数虽然声明为无入参,但调用时却是可以传入任何参数或不传参数的。2 A9 l8 _8 w" U  b% y
4 b" S( j" b- W* R
5、int main(int argc,char *argv[])
6 B: k$ Z* P1 @  P

8 ~/ H" J3 ?7 P3 a
int argc入参为命令行参数个数,char *argv[]入参为命令行参数数组。这种写法也比较常见的,主要用在需要从命令行获取参数的功能。
4 D$ T; ]( P& z/ E: i1 H3 \( T" W
6、int main(int argc,char *argv[],char *envp[])# ]/ \4 j4 t- _" g
包含三个参数的一种写法,上面第5种的升级版,int argc是命令行参数个数,char *argv[]是命令参数数组,char *envp[]是环境变量数组。虽然只比第六种多了一个参数,但全局变量environ可以代替envp的作用,获取或者设置环境变量可以使用getenv或putenv,因此也没有必要使用该形式。这种写法多源于编译器的扩展。7 n1 h' Y, t6 R" n3 K8 V7 o
上面写了这么多种写法,那么到底写哪种才算是对的?9 O* @+ N5 N7 p4 K4 W
查阅C89/C99/C11标准文档,里面明确固定了两种写法:
  1. 0 J0 j3 y/ |5 Z9 P9 ~: o1 L8 v
  2. int main(void) { /* ... */ }. C1 ~8 y% y! q4 v  @1 V
  3. int main(int argc, char *argv[]) { /* ... */ }
复制代码
& P) v  z- f4 {6 ^

% k7 i6 l+ G# c3 _
所以说,其他的写法并不符合标准,有些算是历史遗留有些算是编译器的扩展,还有些不知道从哪里生出来的。, w! ]" w. M& I' _/ F
所以说了这么多,为了代码的通用可移植性,建议采用标准提供的形式,还是推荐使用标准文档中规定的这两种写法。如果一个函数确定无需传入任何参数,那么用void限定是一个不错的选择。
5 |- ^4 W- w# P1 X, W: _" S" D( t2 p: R) z- j
所以说,你明白要怎么写main函数了吗?
赞 收藏 评论0 发布时间:2020-3-26 14:07

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版