main()函数的参数有什么作用?

19
每次我使用Xcode创建标准命令行实用程序项目时,我的main函数都是这个样子的:
int main(int argc, const char * argv[])

括号里的东西是什么?为什么要用这个,而不是只用int main()


2
标准C语言识别 int main(int argc, char *argv[])(或等效形式 int main(void)),但不识别你使用 const 修改的 argv 版本(这是你的实现提供的扩展)。如果你想让你的代码可移植到其他实现中,就要去掉 const - pmg
2
@pmg:或者,由于原帖作者也不知道argcargv是什么,可以直接用void替换它们。 - David Thornley
这个回答解决了你的问题吗?int argc,char * argv []是什么意思? - reinierpost
5个回答

45

main函数接收程序启动时传递给它的参数个数和参数内容,因此你可以访问它们。

argc包含了参数的个数,argv包含了指向参数的指针。 argv[argc]始终是一个NULL指针。这些参数通常包括程序名称本身。

通常情况下,如果你像这样运行程序:./myprogram

  • argc为1;
  • argv[0]是字符串"./myprogram";
  • argv[1]是一个NULL指针。

如果你像这样运行程序:./myprogram /tmp/somefile

  • argc为2;
  • argv[0]是字符串"./myprogram";
  • argv[1]是字符串"/tmp/somefile";
  • argv[2]是一个NULL指针。

4

虽然不被标准所覆盖,但在Windows和大多数Unix和Linux系统中,main函数可以拥有最多三个参数:

int main(int argc, char *argv[], char *envp[])

最后一个变量与 argv 类似(argv 是一个字符串数组,如其他答案所述,用于指定在命令行中传递给程序的参数)。但它包含环境变量,例如 PATH 或您在操作系统 shell 中设置的任何其他变量。它以 null 结尾,因此不需要提供计数参数。

2
envp可能是您的实现的扩展:它不被标准(C89C99)描述。 - pmg
@pmg - 已修正答案,删除了不正确的标准参考。 - Daniel Earwicker
2
Mac OS X和Darwin有一个包含任意操作系统提供的信息的第四个参数,例如执行二进制文件的路径: 'int main(int argc, char **argv, char **envp, char **apple);' - phuclv
关于此事,引用C11标准的一段话:http://port70.net/~nsz/c/c11/n1570.html#J.5.1 - Spikatrix

2

以下内容是关于使用命令行参数的:

argc 包含命令行中的参数数量(包括程序名称),而 argv 是实际参数列表(表示为字符串)。


1

这些用于传递命令行参数。

例如:如果您想从外部向进程传递文件名,则

myExe.exe "filename.txt"

命令行中的"filename.txt"将被存储在argv[]中,而命令行参数的数量(计数)将被存储在argc中。


1

main()是一个函数,实际上可以最多接受三个参数或者没有参数。main()可以接受的参数如下:

1) int argc: 它保存传递的参数数量(从命令提示符)在程序执行期间或者说它用于跟踪在程序执行期间传递的变量数量。它不能保存负值。例如,如果您传递可执行文件“./a.out”,那么它将被视为参数,因此argc值将为0,即传递了1个值。

2) char *argv[]: 这是一个字符指针数组,它保存从命令提示符传递的字符串(字符数组)的地址,在程序执行期间。例如,在上面的例子中,如果你在cout中写了argv[argc]即argv[0],那么输出将会是./a.out。

3) char*envp[]: 这也是一个字符指针数组,用于保存程序中使用的环境变量的地址。环境变量是一组动态命名的值,可以影响计算机上运行进程的方式。例如,正在运行的进程想要存储临时文件,那么它将调用TEMP环境变量来获取一个合适的位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接