免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 11039 | 回复: 77
打印 上一主题 下一主题

[C] 请教一个关于main()函数的问题。。(新手请教) [复制链接]

论坛徽章:
1
白羊座
日期:2014-03-22 18:23:03
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-13 18:38 |只看该作者 |倒序浏览
本帖最后由 _HellAngel_ 于 2013-01-13 18:39 编辑

今天看书,看到指针中“命令行参数”这一节。书中写道:
在支持C语言的环境中,可以在程序开始执行时将命令行参数传递给程序。调用主函数main时,它带有两个参数。第一个参数(习惯上称为argc,用于参数计数)的值表示运行程序时命令中参数的数目;第二个参数(称为argv,用于参数向量)是一个指向字符串数组的指针,其中每个字符串对应一个参数。我们通常用多级指针处理这些字符串。


恩,然后我就发现,这节中的主函数,书中都用了这个定义法:
  1. int main(int argc, char *argv[])
复制代码
总觉得main()函数比较特殊,所以有些时候觉得似乎与一般的函数之间有些区别,但也说不上来。= =
以及,平常为什么都省略成了
  1. int main(void)
复制代码
恩。。另外。。多级指针。。是个神马。。= =

大家发表下自己的观点,小弟先谢谢各大家了。。。

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
2 [报告]
发表于 2013-01-13 19:01 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2013-01-13 19:17 |只看该作者
本帖最后由 timothyqiu 于 2013-01-13 19:18 编辑

比如 C99 标准:

The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters:

int main(void) { /* ... */ }
or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared):

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

or equivalent; or in some other implementation-defined manner.


也就是说,整个程序就是通过从外部调用本程序的一个叫 main 的函数开始的。

  • int main(void)
  • int main(int argc, char *argv[])
  • 其它由具体实现定义的形式(比如有的实现还定义了 int main(int argc, char *argv[], char *env[]) 的形式)


所以 main 和其它函数没什么大区别,只不过要求你写成某种形式。

至于省略写 int main(void),多是用不到 argc argv 什么的话这么写省字数(也省键盘……不然真成 keyboard killer 了……)

(至于为什么可以允许这么多种形式存在,多是因为 cdecl 是调用者清栈的。当然不一定都是这样。)

至于「多级指针」,就是一种指针,这种指针指向另一个指针(如此往复)……

为什么把 argv 称作「多级指针」呢?因为参数中的 char *argv[] 可以写成 char **argv (参考 @Ager 大神之前的帖子 http://bbs.chinaunix.net/thread-4060180-1-1.html)……

论坛徽章:
1
白羊座
日期:2014-03-22 18:23:03
4 [报告]
发表于 2013-01-13 19:22 |只看该作者
回复 3# timothyqiu

SOGA。。。。。。3Q。。。。
   

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
5 [报告]
发表于 2013-01-13 19:35 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
白羊座
日期:2014-03-22 18:23:03
6 [报告]
发表于 2013-01-13 19:39 |只看该作者
回复 5# pmerofc

恩。。谢了。。
   

论坛徽章:
0
7 [报告]
发表于 2013-01-13 20:04 |只看该作者
pmerofc 发表于 2013-01-13 19:35
回复 1# _HellAngel_

main()函数不用写函数类型声明


实际上是需要声明的(标准里也明确说没有声明 main)。如果有写在 main 函数前面的函数需要调用 main,那么还是需要声明的,比如:
  1. #include <stdio.h>

  2. int foo()
  3. {
  4.     char *newargs[] = {"test", "args"};
  5.     return main(sizeof(newargs)/sizeof(newargs[0]), newargs);
  6. }

  7. int main(int argc, char *argv[])
  8. {
  9.     printf("argc = %d\n", argc);

  10.     if (argc == 1) {
  11.         return foo();
  12.     }

  13.     return 0;
  14. }
复制代码
这个用 GCC 编译就会报 warning: implicit declaration of function 'main' [-Wimplicit-function-declaration]。

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
8 [报告]
发表于 2013-01-13 20:36 |只看该作者
本帖最后由 Ager 于 2013-01-13 20:41 编辑

To @_HellAngel_

你可能不知道#5楼的pm与#7楼的timothyqiu所讨论的,是针对啥问题,我来稍微解释一下。

#7楼的timothyqiu所讲的这个事情,就是:你应该在代码中,于函数foo()中的
  1. return main(sizeof(newargs)/sizeof(newargs[0]), newargs);
复制代码
之前的位置(只要合乎标准与你的意图,不论怎么个“之前”法都可以),加上这麽一行:
  1. int main(int, char **);
复制代码
之所以要这样做,跟函数main()本身的特性关系并不大,这属于C语言关于编译单元中的函数的一般策略。

仅供参考 :)

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
9 [报告]
发表于 2013-01-13 20:55 |只看该作者
和一般函数没区别,
只是连接程序会自动找main将其作为程序入口(第一个被Call的函数,好吧,c++的情况下不是这样)
有不同写法是因为历史原因。

不论你写
int main(int argc,char *argc)
写是 void main(void)

连接程序看到的只是符号 _main而已,所以形式可以随意,那当然,系统会按约定给它传参数argc,argv,及argenv,不管它被写成什么形式

论坛徽章:
1
白羊座
日期:2014-03-22 18:23:03
10 [报告]
发表于 2013-01-13 20:55 |只看该作者
回复 8# Ager

恩。。谢谢Ager哥。。。现在懂了。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP