在许多c++ IDE和编译器中,当它为你生成main函数时,它看起来像这样:

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

当我在没有IDE的情况下编写c++代码时,只是使用命令行编译器,我键入:

int main()

没有任何参数。这意味着什么?它对我的程序至关重要吗?


当前回答

只是补充一下,因为有人说有第三个参数(*envp[]),这是真的,有,但不是POSIX安全,如果你想让你的程序使用环境变量,你应该使用extern char environ;D

其他回答

main的参数表示程序启动时提供给程序的命令行参数。argc形参表示命令行参数的数量,char *argv[]是一个字符串数组(字符指针),表示命令行上提供的各个参数。

int main();

这是一个简单的声明。它不能接受任何命令行参数。

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

当程序必须接受命令行参数时,使用此声明。当像这样运行时:

myprogram arg1 arg2 arg3

argc,或参数计数,将被设置为4(四个参数),argv,或参数向量,将被填充为指向"myprogram", "arg1", "arg2"和"arg3"的字符串指针。程序调用(myprogram)包含在参数中!

或者,你可以用:

int main(int argc, char** argv);

这也是成立的。

你可以添加另一个参数:

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

参数envp还包含环境变量。每个条目都遵循以下格式:

VARIABLENAME=VariableValue

是这样的:

SHELL=/bin/bash    

环境变量列表以空结尾。

重要提示:不要在调用system()时直接使用任何argv或envp值!这是一个巨大的安全漏洞,因为恶意用户可以将环境变量设置为命令行命令,并(潜在地)造成巨大的破坏。一般来说,不要使用system()。通过C库实现几乎总是有更好的解决方案。

main函数可以有两个形参,argc和argv。Argc是一个整数(int)形参,它是传递给程序的参数数。

程序名总是第一个参数,所以一个程序至少有一个参数,argc的最小值为1。但如果程序本身有两个参数,argc的值将是3。

参数argv指向一个字符串数组,称为参数向量。它是一个一维的函数参数字符串数组。

让我们考虑声明:

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

在上面的声明中,第二个名为argv的形参的类型实际上是一个char**。也就是说,argv是一个指向char类型指针的指针。这是因为由于类型衰减,char*[]衰减为char**。例如,下面给出的声明是等价的:

int main (int argc, char *argv[]); //first declaration
int main (int argc, char **argv);  //RE-DECLARATION. Equivalent to the above declaration

换句话说,argv是指向char*类型元素数组的第一个元素的指针。此外,数组中的每个元素argv[i](包含char*类型的元素)本身指向一个字符,该字符是一个以空结尾的字符串的开始。也就是说,每个元素argv[i]指向一个包含char类型(而不是const char类型)元素的数组的第一个元素。为了说明目的,给出了一个图表:

正如在其他回答中已经说过的,当我们想要使用命令行参数时,使用这种形式的main声明。

当使用int和char**时,第一个参数将是调用程序的命令数量,第二个参数是所有这些命令