关于main(int argc, char **argv)

来源:百度知道 编辑:UC知道 时间:2024/05/23 09:42:10
这个main函数写在主程序里?能编译么?那main的参数由谁传?运行什么样子的?
其实我的意思是argc这个参数知由谁传?现在主程序就是:
main(int argc, char **argv)
{……
}
那2个参数值怎么办呢?
2楼说操作系统传?传的值?

搞个具体的吧,我现在编了个cpp
int main(int argc, char **argv)
{
if(argc==1)
cout<<'a';
else
cout<<'b';
return 0;
}
运行后输出的是1,也就是说系统传的参数值默认是1?我能修改么?

你可以照二楼的这样来理解,应该说基本这样理解不会耽误事的.而且比较好理解!
但是你的问题的确切答案不是这样的:
不管什么样的MAIN,在VC中编译的时候,实际上在MAIN的外层是还有东西的.你可以看下crt0.CPP的源代码.
argc, argv等都是在crt0.cpp里实现,然后以ret = (main(argc, argv));开始调用main函数,当main用return时,ret就接受了这个return值.
因此各种main(WinMain,wWinMain,wMain,Main)的外层是在crt0(C RunTime)这个C运行时库源代码文件中实现,且由连接器将它与我们的MAIN文件连接来生成最终的EXE文件.当双击EXE文件时,由操作系统的加载程序来把EXE加载到内存中,从通常的进程虚拟地址0X00400000开始让CPU执行代码.
另外:如果你不研究操作系统的话,我想说你别去深究你的这个问题了,深究的话会牵出一大堆和操作系统有关的知识的,一时根本无法完全讲清楚.
回答补充:
当然能了。
1)在命令提示符下:输入你的EXE文件名,然后一个空格,再输入随便什么字母。然后看下程序输出的是b. (EXE文件名可以看成是一个参数,因此argc为1,argv为NULL)
2)用VC的话,看下工程属性里可以设置为程序传递的参数。(无法多说了,否则你可能又会有新的问题:为什么在VC工程属性里设置了参数就能传给MAIN(ARGC,ARGV)!)
不要再想这个问题了,以你现在的知识面没法理解,也不是几句话就能让你彻底明白的。
鉴于你的水平,你贴问题的话还是在C/C++里贴吧,你的问题不属于VC++范畴。

main函数是程序的入口点,相当于一个房子的门,但是程序比较笨,所以不一样的门他还没办法都认识,所以当初就规定统一使用main函数作为入口点,一般来说是操作系统来负责传递这个参数。当你告诉操作系统你要运行一个程序的时候,那么操作系统实际上就准备好参数调用main的参数,然后调用main函数,那么操作系统就可以将权力转交给main函数了,程序就开始运行了,等main函数运行到return的时候,恩,操作系统就知道这个程序运行完